“动态”解析InputStream /重新使用InputStream

时间:2015-06-18 10:17:51

标签: java xml-parsing inputstream

我有一个InputStream,它包含我想在返回InputStream之前解析的XML数据。

InputStream is = myObj.getInputStream();

// parse Inputstream here

return is;

当然,我可以将流保存为字节数组,并从中返回一个新的InputStream或

在'myObj'上创建第二个InputStream。

但是有什么办法可以“动态”解析流吗?

修改

基本上我正在寻找一种在解析后重用流的方法。解析流而不消耗它,分别在解析后重置它。

解决方案:

我发现的解决方案是使用BufferedInputStream(注释中的注释:那将只能工作8k字节)

BufferedInputStream is = new BufferedInputStream ( myObj.getInputStream() );

is.mark( Integer.MIN_VALUE );

// parse Inputstream here

is.reset();

return is;

3 个答案:

答案 0 :(得分:2)

要动态解析 ,而无需等待流的结尾,您可以使用Sax Parser

sax解析器是基于事件的,因此在处理之前无需读取整个文档。有了这个过程就像:

  • 标签人员已打开
  • 标签名称已打开
  • 标签名称已关闭
  • 标签姓氏已打开
  • 标签姓氏已关闭
  • 标签人员已关闭

对于每个事件,您需要执行一些自定义代码。

使用sax解析器比dom解析器困难但有一些优点。总而言之,它需要更少的资源,您不需要等待整个文档。

答案 1 :(得分:0)

这可能非常复杂,因为即时xml解析SAX Parser的最佳候选者。根据需要,它是事件驱动的,并依赖于回调方法来指示传入流中的事件。

我通过执行以下操作实现了类似的功能:

  1. 创建队列。
  2. 使用SAXParser解析一个解析XML的线程,将结果推送到队列中。
  3. 迭代队列。
  4. 这不简单但稳定可靠。我会尝试发布一些演示代码。

答案 2 :(得分:-1)

我找到的解决方案(至少对我有用的解决方案)是使用BufferedInputStream:

BufferedInputStream is = new BufferedInputStream ( myObj.getInputStream() );

is.mark( Integer.MIN_VALUE );

// parse Inputstream here

is.reset();

return is;