【问题标题】:What is difference between a stream and the actual data?流和实际数据有什么区别?
【发布时间】:2011-03-12 09:41:19
【问题描述】:

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

【问题讨论】:

    标签: java xml rest saxparser


    【解决方案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");
        }
      }
    
    }
    

    【讨论】:

    • 所以当我创建一个 InputStream 时,数据是否开始自动流入?或者我必须使用一些方法来获取它??关于错误,我检查了数据并且它存在。那么有没有办法避免将其写入文件。
    • parse 方法执行此数据提取。在您的情况下,据说 XML 格式不正确,这意味着缺少一些结束标记。
    • 缺少的不仅仅是结束标签。错误消息说在第 1 行第 1 列中,它到达了文件末尾。这意味着已经读取了 0 个字节。
    • 您提供的代码打开了与 web 上的 xml 文件的连接。而我正在尝试处理来自基于 Rest 的 web 服务的响应。有什么不同吗?
    • 不,没有区别。这两种 Web 技术最终都会生成 InputStream,这就是您向 XML 解析器提供的内容。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 2013-08-22
      • 2018-04-09
      • 1970-01-01
      • 2022-11-13
      相关资源
      最近更新 更多