我有一个
BufferedInputStream
,我想用 SAXParser
从中解析 XML,然后再次重用它(例如 mark(int)
和 reset()
)。然而这个流在 parse()
方法中被关闭。是否有可能以某种方式告诉 SAXParser
将其保持打开状态?最后的手段是用不可关闭的流来包装这个流。
谢谢你。
像这样的东西怎么样:
class WontCloseBufferedInputStream extends BufferedInputStream {
public void close () {
// Do nothing.
}
public void reallyClose() {
super.close ();
}
}
我对 InputStream 使用以下包装器来防止解析器 vom 关闭原始流:
private static class InputStreamWrapper extends InputStream {
private InputStream input;
public InputStreamWrapper(InputStream input) {
this.input = input;
}
@Override
public int read() throws IOException {
return input.read();
}
// Must be overriden for better performance
@Override
public int read(byte[] b, int off, int len) throws IOException {
return input.read(b, off, len);
}
@Override
public void close() {
}
}
包装纸的使用方式类似于
saxParser.parse(new InputStreamWrapper(input), handler)
。
将InputStream放入InputSource并没有帮助。这是由 SAX 解析器在内部完成的。
您可以将 InputSource 对象而不是 InputStream 对象传递给 SAXParser
示例代码
SAXParser parser = // saxpaser object
InputSource isource = new InputSource();
InputStream istream = //your inputstream
isource.setByteStream(istream);
parser.parse(isource, handler);