流和实际数据有什么区别?

时间:2011-03-12 09:41:19

标签: java xml rest saxparser

在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)

2 个答案:

答案 0 :(得分:1)

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");
    }
  }

}

答案 1 :(得分:0)

在Java中没有“数据”这样的东西,只有“对象”。与其他所有内容一样,InputStream是一个对象。它有一些方法,比如read(),可以让你访问数据。询问它是否“是”数据是一个毫无意义的问题 - 面向对象语言的原则是数据总是隐藏在接口后面,例如read()接口。