解析 InputStream "on the fly" / 重新使用 InputStream

Parse InputStream "on the fly" / re-use an InputStream

我有一个包含 XML 数据的 InputStream,我想在 return 输入 InputStream 之前对其进行解析。

InputStream is = myObj.getInputStream();

// parse Inputstream here

return is;

当然我可以将流保存为字节数组并 return 一个新的 InputStream 或者

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

但是有没有办法解析流'on the fly'?

编辑:

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

解法:

我找到的解决方案是使用 BufferedInputStream(评论中的注释:最多只能处理 8k 字节)

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

is.mark( Integer.MIN_VALUE );

// parse Inputstream here

is.reset();

return is;

要即时解析 ,无需等待流结束,您可以使用 Sax Parser.

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

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

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

使用 sax 解析器比 dom 解析器稍微难一点,但也有一些优势。总而言之,它需要的资源更少,而且您无需等待即可获得整个文档。

这可能会相当复杂,因为动态 xml 解析 SAX Parser 的最佳候选者。它必然是事件驱动的,并依赖于回调方法来指示传入流中的事件。

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

  1. 创建队列。
  2. 使用 SAXParser 启动解析 XML 的线程,将结果推送到队列中。
  3. 遍历队列。

这并不简单,但稳定可靠。我会尝试 post 一些演示代码。

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

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

is.mark( Integer.MIN_VALUE );

// parse Inputstream here

is.reset();

return is;