我有一个fileInputStream对象可能包含或不包含xml声明<?xml version='1.0'?>
。如果存在,我需要去掉xml声明。我怎么做,而无需将inputStream对象转换为字符串,剥离XML PI,然后将其转换回输入流?如何去除java中输入流的前几个字符?
InputStream inputStream = new FileInputStream(importFilePath);
我有一个fileInputStream对象可能包含或不包含xml声明<?xml version='1.0'?>
。如果存在,我需要去掉xml声明。我怎么做,而无需将inputStream对象转换为字符串,剥离XML PI,然后将其转换回输入流?如何去除java中输入流的前几个字符?
InputStream inputStream = new FileInputStream(importFilePath);
裹在PushbackInputStream的FileInputStream
,并查看是否有PI开始。如果是这样,那就读出来。否则,请推回您阅读的字符以测试它。
我能想到的两个选项:
使用FileInputStream.getChannel()。从频道读取后,如果需要将position(0)
重置为开头,则可以调用position(0)
。
使用自定义FilteredInputStream来包装InputStream。这可以用第一行预先缓冲的方式来写,以确定它是否会被使用或丢弃。
正如@MattTimmermans所述,有一个可用的FilteredInputStream实现可用于#2(PushbackInputStream)中提到的此目的。但是它保持连续的缓冲区,而不仅仅是最初的行。 –
这不是xml处理指令,它被称为xml声明......它可能包含关于xml的重要信息,比如编码类型,没有这些信息数据可能会变得无效......这是你真正想做什么? –
你是对的。它不是一个PI。我把它称为PI,因为在我的场景中,我不得不在输入流的开头附加,在蒸汽结束时附加 ,我需要将生成的流传递给org.w3c.dom.Document.parse( )。解析方法抛出一个异常,说“org.xml.sax.SAXParseException:处理指令不能以xml开头”。这个异常指向XML声明的开始,并且说PI不能以xml开头。 –
arun8
是的。我的目标是从inputStream中去除xml声明。 – arun8