【问题标题】:Parse InputStream "on the fly" / re-use an InputStream“即时”解析 InputStream / 重新使用 InputStream
【发布时间】:2015-09-03 22:21:17
【问题描述】:

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

InputStream = myObj.getInputStream(); // 这里解析输入流 回报是;

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

在“myObj”上创建第二个 InputStream。

但是有什么方法可以“即时”解析流吗?

编辑:

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

解决方案:

我找到的解决方案是使用 BufferedInputStream(来自 cmets 的注意:最多只能工作 8k 字节)

BufferedInputStream is = new BufferedInputStream (myObj.getInputStream()); is.mark(Integer.MIN_VALUE); // 这里解析输入流 is.reset(); 回报是;

【问题讨论】:

    标签: java xml-parsing inputstream


    【解决方案1】:

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

    BufferedInputStream is = new BufferedInputStream (myObj.getInputStream()); is.mark(Integer.MIN_VALUE); // 这里解析输入流 is.reset(); 回报是;

    【讨论】:

    • 这最多只能工作 8k 字节,或者您在构造缓冲输入流时指定的任何缓冲区大小。
    【解决方案2】:

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

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

    1. 创建队列。
    2. 触发一个线程,该线程使用 SAXParser 将结果推送到队列中来解析 XML。
    3. 遍历队列。

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 主要问题是,我只能使用一次 InputStream。 Sax Parser 会消耗 InputStream 还是会像未触及流一样返回流?
      猜你喜欢
      • 2013-09-03
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多