【问题标题】:How to strip the first few characters of an input stream in java?如何在java中去除输入流的前几个字符?
【发布时间】:2017-03-29 19:23:37
【问题描述】:

我有一个 fileInputStream 对象,它可能包含也可能不包含 xml 声明 <?xml version='1.0'?>。如果存在,我需要剥离 xml 声明。如何在不将 inputStream 对象转换为字符串、剥离 XML PI 然后将其转换回输入流的情况下做到这一点?

InputStream inputStream = new FileInputStream(importFilePath);

【问题讨论】:

  • 这不是xml处理指令,它被称为xml声明...它可能包含有关xml的重要信息,例如编码类型,没有这些数据可能会变得无效...这是什么你真的想做吗?
  • 你是对的。它不是 PI。我将其称为 PI,因为在我的场景中,我必须在输入流的开头附加 并在 Steam 的末尾附加 ,我需要将结果流传递给 org.w3c.dom .Document.parse()。 parse 方法抛出异常说“org.xml.sax.SAXParseException:处理指令不能以 xml 开头”。异常指向 XML 声明的开头并说 PI 不能以 xml 开头。
  • 是的。我的目标是从 inputStream 中去掉 xml 声明。

标签: java xml inputstream java-io


【解决方案1】:

FileInputStream 包裹在PushbackInputStream 中,并检查它是否以PI 开头。如果是这样,那就把它读出来。否则,将您阅读的字符推回以进行测试。

【讨论】:

    【解决方案2】:

    我能想到两个选择:

    1. 使用FileInputStream.getChannel()。从频道读取后,您可以根据需要调用position(0) 将其重置为开头。

    2. 使用自定义 FilteredInputStream 包装 InputStream。可以这样写,提前缓冲第一行,以确定是使用还是丢弃。

    【讨论】:

    • 正如@MattTimmermans 所指出的,有一个可用的FilteredInputStream 实现可以服务于#2(PushbackInputStream)中提到的这个目的。然而,它保持一个连续的缓冲区,而不仅仅是初始行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多