【问题标题】:Java Wrapping an InputStreamJava 包装 InputStream
【发布时间】:2011-02-24 17:12:06
【问题描述】:

我需要从 InputStream 中反复读取。该流来自从 Web 服务请求中读取一些 XML。我想将 XML 保存在内存中,以便我可以多次解析流,并最终在稍后的某个时间丢弃 XML。 我可以用什么包装 InputStream 以便我可以多次访问它?

【问题讨论】:

标签: java inputstream


【解决方案1】:

假设您正在阅读一个结构良好的 XML 文档,为什么不使用 DOM 解析器一次解析该文档(例如,javax.xml.parsers.DocumentBuilder)?

这将为您提供结构化格式的 XML 文档的内存表示。如果您使用DocumentBuilder 之类的解析器,则可以随后使用Node 之类的getElementsByTagName 等方法获取结构化数据的各个部分。

【讨论】:

  • 我想使用 JAXB,但多次读取 XML 时遇到问题
  • @bmw0128 你可以从 DOM 加载 JAXB。
【解决方案2】:

你可以试试

byte[] bytes = IOUtils.toByteArray(inputStream);

// as often as desired.
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

【讨论】:

    【解决方案3】:

    Apache Commons IO 有一个实用方法,可以将输入流读入字节数组(如果您不想自己编写函数),您可以将其包装在 ByteArrayInputStream 中,即

    InputStream xmlInput = ...;
    InputStream rereadableStream = 
        new ByteArrayInputStream(IOUtils.toByteArray(xmlInput));
    

    然后使用 mark() / reset() 或者简单地保存字节数组并在需要时构造一个新的 ByteArrayInputStream。

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2011-09-16
      • 2011-04-05
      • 1970-01-01
      • 2014-02-12
      相关资源
      最近更新 更多