解析 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 的最佳候选者。它必然是事件驱动的,并依赖于回调方法来指示传入流中的事件。
我通过执行以下操作实现了类似的功能:
- 创建队列。
- 使用 SAXParser 启动解析 XML 的线程,将结果推送到队列中。
- 遍历队列。
这并不简单,但稳定可靠。我会尝试 post 一些演示代码。
我找到的解决方案(至少是对我有用的)是使用 BufferedInputStream:
BufferedInputStream is = new BufferedInputStream ( myObj.getInputStream() );
is.mark( Integer.MIN_VALUE );
// parse Inputstream here
is.reset();
return is;
我有一个包含 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 的最佳候选者。它必然是事件驱动的,并依赖于回调方法来指示传入流中的事件。
我通过执行以下操作实现了类似的功能:
- 创建队列。
- 使用 SAXParser 启动解析 XML 的线程,将结果推送到队列中。
- 遍历队列。
这并不简单,但稳定可靠。我会尝试 post 一些演示代码。
我找到的解决方案(至少是对我有用的)是使用 BufferedInputStream:
BufferedInputStream is = new BufferedInputStream ( myObj.getInputStream() ); is.mark( Integer.MIN_VALUE ); // parse Inputstream here is.reset(); return is;