如何防止 DocumentBuilderFactory 关闭底层输入流
how to prevent DocumentBuilderFactory close underlying inputstream
我正在尝试使用 DocumentBuilderFactory
解析 xml 文件
解析进行得很顺利,但问题是 DocumentBuilderFactory 在调用我不想要的解析方法时关闭了底层流,因为我需要进一步处理流
我创建了一个包装器 class 以防止关闭输入流,但它仍然会关闭它
有什么建议吗?
这是我的包装纸class
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
对象并将新对象用于第二个用例。
根据要求将其添加为答案。
我正在尝试使用 DocumentBuilderFactory
解析 xml 文件
解析进行得很顺利,但问题是 DocumentBuilderFactory 在调用我不想要的解析方法时关闭了底层流,因为我需要进一步处理流
我创建了一个包装器 class 以防止关闭输入流,但它仍然会关闭它
有什么建议吗?
这是我的包装纸class
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
对象并将新对象用于第二个用例。
根据要求将其添加为答案。