java - 如何防止 DocumentBuilderFactory 关闭底层输入流
问题描述
我正在尝试使用 DocumentBuilderFactory 解析 xml 文件
解析进展顺利,但问题是 DocumentBuilderFactory 在调用我不想要的 parse 方法时关闭了底层流,因为我需要进一步处理流
我创建了一个包装类以防止输入流关闭,但它仍然关闭它
请问有什么建议吗?
有我的包装类
import java.io.IOException;
import java.io.InputStream;
public class UncloseableInputStream extends InputStream {
private final InputStream input;
private boolean canBeClosed = false;
public UncloseableInputStream(InputStream input) {
this.input = input;
}
@Override
public void close() throws IOException {
if(canBeClosed) {
super.close();
}
}
@Override
public int read() throws IOException {
return input.read();
}
public void allowToBeClosed() {
canBeClosed = true;
}
}
示例 DocumentBuilderFactory 解析代码
builderFactory = DocumentBuilderFactory.newInstance();
builder = builderFactory.newDocumentBuilder();
try {
//NOT EMPTY
byte[] bytesFile = batchFileUtils.fileToByteArray(inputStream);
System.out.println("ok");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
xmlDocument = builder.parse(new UncloseableInputStream(inputStream));
try {
//EMPTY
byte[] bytesFile = batchFileUtils.fileToByteArray(inputStream);
System.out.println("ok");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
非常感谢你
解决方案
如评论部分所述,针对此特定请求的解决方案是复制当前inputStream
对象并将新对象用于第二个用例。
根据要求将其添加为答案。
推荐阅读
- macos - nodemon:找不到命令
- c# - ASP.NET:ItemTemplate 中 2 个差异值的条件逻辑
- java - 如何使用长按释放手势检测轻按和长按的手势
- python - 文本分类 + 朴素贝叶斯 + Python:输入包含 NaN、无穷大或对于 dtype('float64') 来说太大的值
- kubernetes - 如何让不同节点上的 pod 到 pod ping 正常工作?
- python - 我很难在 Spyder (Python 3.6) 中获得完整的输出列表
- c++ - 使用 Scanf 调试断言失败
- erlang - 元组列表 [{id, [
- ]}, {id2, [
- ]} ] 其中 ids 是原始列表元组的第二项 - Erlang
- javascript - 发出 Fetch Get 请求时出现 404 错误
- ruby - 进程如何以 Process.wait 不会注意到的方式死亡?