在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)
答案 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()接口。