【发布时间】:2014-06-25 22:20:09
【问题描述】:
我正在从 HttpUrlConnection (connection.getInputStream()) 接收 InputStream,并且正在使用 DocumentBuilder (documenbtBuilder.parse(inputStream)) 解析输入流。在解析之前,我想将接收到的数据写入日志文件。当我这样做时,我得到 org.xml.sax.SAXParseException: Unexpected end of document Exception in the parse 方法。如果我不写入文件,我的代码可以正常工作,但我需要记录收到的数据。
请在下面找到写入文件的代码:
final InputStream input = connection.getInputStream();
writeLogInfo(input);
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(input);
//Method that writes tito log file.
private void writeLogInfo(InputStream input){
OutputStream os = new FileOutputStream("mylogfile.txt");
byte[] buffer = new byte[1024];
int byteRead;
while((byteRead = input.read(buffer)) != -1){
os.write(buffer,0,byteRead);
}
os.flush();
os.close();
}
我怀疑这是因为多次使用 InputStream,因为当我不调用 writeLogInfo() 时代码有效。我没有在我的代码中的任何地方关闭输入流。我在这里做错了什么?
【问题讨论】:
-
确实,您不能像那样双重使用 InputStream。您基本上有三个选择:1)两次获取数据 2)将数据写入文件,然后打开 FileInputStream 并将其读回以进行解析。 3)创建自己的实现 InputStream 的包装类,将其包装在源类周围,以便它的 read() 调用源 read() 并在将结果数据提供给解析器之前记录结果数据,解析器作为最终消费者将控制节奏阅读。