java - 如何在Android中记录和解析InputStream

标签 java android inputstream

我使用以下代码解析输入流,它工作正常。

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
XmlHandlerMatchDetails handler = new XmlHandlerDetails();
xr.setContentHandler(handler);
xr.parse(new InputSource(data));

现在我需要记录InputStream来检查它,我这样更改之前的代码:

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
XmlHandlerMatchDetails handler = new XmlHandlerDetails();
xr.setContentHandler(handler);
xr.parse(new InputSource(data));

BufferedReader br = new BufferedReader(new InputStreamReader(data)); 
StringBuilder sb = new StringBuilder(); 
String line; 
while ((line = br.readLine()) != null) {     
   sb.append(line); 
} 
String text = sb.toString();
Log.i(mTag, text);

但我有错误

09-19 12:13:02.982: ERROR/MyClass(338): java.io.IOException: 尝试在关闭的流上读取。

如何在不关闭流的情况下记录或将流转换为字符串?

编辑 - 已解决!!!

我通过解析字符串而不是InputStream来解决它

xr.parse(new InputSource(new StringReader(text)));

最佳答案

我不确定这就是问题所在,但您可以尝试将 while 循环重写为:

while( br.ready() )
  sb.append( br.readLine() );

我想到的另一件事是,您使用的 InputStream(数据)可能无法读取两次 - 因此,首先使用 XmlReader 解析它会导致它关闭,然后当您使用时它不会打开尝试使用 BufferedReader 解析它。要验证这一点,请尝试运行 BufferedReader,而不先使用 XmlReader 解析数据。

关于java - 如何在Android中记录和解析InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7470933/

相关文章:

Java RMI - 从 Ubuntu 到 OSX 的远程调用超慢

java - 使用 javax.ws.rs.core.Application 实现通用 JAX-RS Web 服务

java - 创建 Abdera 客户端失败

java - 如何在android中制作一个布局,使其粘在屏幕底部,直到 ScrollView 滚动到它也滚动的某个位置?

Java网络编程从客户端读取数据

java - hive 如何查找给定的十进制值与定义的十进制类型不正确并返回 NULL

java - 无法附加文件发送电子邮件android 11

java - 如何从android中的Map中获取键值对

c++ - 如何将 'fixed' floatfield 用于 istream/istringstream?

java - 有没有一种方法可以将 InputStream 数据解码为文本,而无需在 InputStream 对象本身上使用流解码器?