В чем разница между потоком и фактическими данными? - PullRequest
0 голосов
/ 12 марта 2011

В Java есть потоки для ввода / вывода.

Меня смущает, что когда я создаю поток, это данные в потоке или просто конвейер для данных?

На самом деле я пытаюсь проанализировать ответ xml, созданный из запроса на отдых, в веб-сервис, который возвращает ответ xml.

//Parse Xml
ParseXml parser=new ParseXml();

parser.parseStream(connection.getInputStream());

где соединение - это объект HttpURLConnection.

Ниже приведен источник для parseStream ()

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

public class ParseXml 
{
    public void parseStream(InputStream input)
    {
        XMLReader xmlReader;

        try 
        {
            xmlReader = (XMLReader) XMLReaderFactory.createXMLReader();
            xmlReader.setContentHandler(new XmlParser());

            xmlReader.parse(new InputSource(input));
        } 
        catch (SAXException e) 
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }




    }


}

Я получаю исключение:

[Fatal Error] :1:1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at xmlparsing.ParseXml.parseStream(ParseXml.java:24)
    at smssend.SmsSend.restHttpPost(SmsSend.java:129)
    at main.SmsApiClass.main(SmsApiClass.java:28)

Ответы [ 2 ]

1 голос
/ 12 марта 2011

InputStream - это то, из чего вы можете читать данные. Я мог бы также назвать это источником данных, но я бы не назвал это конвейером. Для меня трубопровод включает в себя несколько частей, которые склеены вместе.

Относительно вашей ошибки синтаксического анализатора: перед подачей данных непосредственно в анализатор, вы должны записать их в файл или System.out, просто чтобы убедиться, что некоторые данные действительно поступили.

Затем вы должны передать эти данные парсеру, чтобы увидеть, что происходит, когда вы передаете ему известные данные.

И если эти два случая работают правильно, вы можете напрямую подавать данные.

[Обновление 2011-03-12]

Вот полный пример, который работает для меня. Может быть, вы можете заметить разницу в вашем коде (из которого вы разместили только части, особенно не часть, которая создает InputStream):

package so5281746;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class ParseXml {

  public static void parseStream(InputStream input) {
    try {
      XMLReader xmlReader = XMLReaderFactory.createXMLReader();
      xmlReader.setContentHandler(new XmlParser());
      xmlReader.parse(new InputSource(input));
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

  public static void main(String[] args) throws IOException {
    URLConnection conn = new URL("http://repo1.maven.org/maven2/org/apache/ant/ant/maven-metadata.xml").openConnection();
    InputStream input = conn.getInputStream();
    parseStream(input);
  }

  static class XmlParser extends DefaultHandler {

    @Override
    public void startDocument() throws SAXException {
      System.out.println("startDocument");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      System.out.println("startElement " + localName);
    }

    @Override
    public void endDocument() throws SAXException {
      System.out.println("endDocument");
    }
  }

}
0 голосов
/ 13 марта 2011

В Java нет такой вещи как «данные», есть только «объекты». Как и все остальное, InputStream является объектом. У него есть методы, такие как read (), которые дают вам доступ к данным. Вопрос о том, «являются» ли они данными, является бессмысленным вопросом - принцип объектно-ориентированных языков заключается в том, что данные всегда скрыты за интерфейсами, такими как интерфейс read ().

...