0

在java中有输入/输出流。

我很困惑,当我创建一个流时,它是流中的数据还是只是数据的管道?

实际上,我正在尝试将从休息请求创建的 xml 响应解析为返回 xml 响应的 Web 服务。

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

parser.parseStream(connection.getInputStream());

其中 connection 是一个 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)
4

2 回答 2

1

AnInputStream是可以从中读取数据的东西。我也可以称它为数据源,但我不会称它为管道。对我来说,管道涉及粘在一起的多个部分。

关于您的解析器错误:在将数据直接提供给解析器之前,您应该将其写入文件或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");
    }
  }

}
于 2011-03-12T09:52:06.393 回答
0

在 Java 中没有“数据”这样的东西,只有“对象”。像其他一切一样,InputStream 是一个对象。它具有诸如 read() 之类的方法,可让您访问数据。询问它是否“是”数据是一个毫无意义的问题——面向对象语言的一个原则是数据总是隐藏在接口后面,例如 read() 接口。

于 2011-03-12T22:58:53.700 回答