2016-11-15 70 views
-1

我有一个fileInputStream对象可能包含或不包含xml声明<?xml version='1.0'?>。如果存在,我需要去掉xml声明。我怎么做,而无需将inputStream对象转换为字符串,剥离XML PI,然后将其转换回输入流?如何去除java中输入流的前几个字符?

InputStream inputStream = new FileInputStream(importFilePath); 
+1

这不是xml处理指令,它被称为xml声明......它可能包含关于xml的重要信息,比如编码类型,没有这些信息数据可能会变得无效......这是你真正想做什么? –

+0

你是对的。它不是一个PI。我把它称为PI,因为在我的场景中,我不得不在输入流的开头附加,在蒸汽结束时附加,我需要将生成的流传递给org.w3c.dom.Document.parse( )。解析方法抛出一个异常,说“org.xml.sax.SAXParseException:处理指令不能以xml开头”。这个异常指向XML声明的开始,并且说PI不能以xml开头。 – arun8

+0

是的。我的目标是从inputStream中去除xml声明。 – arun8

回答

4

裹在PushbackInputStreamFileInputStream,并查看是否有PI开始。如果是这样,那就读出来。否则,请推回您阅读的字符以测试它。

1

我能想到的两个选项:

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

  2. 使用自定义FilteredInputStream来包装InputStream。这可以用第一行预先缓冲的方式来写,以确定它是否会被使用或丢弃。

+0

正如@MattTimmermans所述,有一个可用的FilteredInputStream实现可用于#2(PushbackInputStream)中提到的此目的。但是它保持连续的缓冲区,而不仅仅是最初的行。 –

相关问题