首页 > 解决方案 > 如何防止 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();
        }

非常感谢你

标签: javainputstream

解决方案


如评论部分所述,针对此特定请求的解决方案是复制当前inputStream对象并将新对象用于第二个用例。

根据要求将其添加为答案。


推荐阅读