zoukankan      html  css  js  c++  java
  • java怎么解除文件占用(Dom4j操作完xml后怎么关流)

    一、背景

      项目中要解析xml,由于Dom4j的诸多优点,我就用Dom4j解析xml,代码如下:

    public void readXML() {
            SAXReader reader = new SAXReader();
            Document doc = null;
    
            try {
                doc = reader.read(new File("demo.xml"));
                Element root = doc.getRootElement();
    
                /**
                 * 其他代码
                 */
            } catch (DocumentException e) {
                e.printStackTrace();
            } 
    }

      查看Dom4j的api,你会发现,不管是SAXReader,还是Document,都没有提供关闭流资源的操作,我当时天真的以为Dom4j自动关闭流资源了,不用我们再关流了。

      后来的某一天,由于业务的需要,需要在程序中删除此xml,我发现不管我用file.deleteOnExit(),还是用file.delete()。都删除不了此xml文件,显示文件被占用,无法删除,我自己用鼠标去删除,也是显示“操作无法完成 因为文件已在 Java™ Platform SE binary 中打开”,至此才发现Dom4j没有关闭流资源,Dom4j当时给我的是幻觉,幸好线上xml文件不是特别多,不然要出生产事故了。

    二、原因

      Dom4j解析完xml没有关闭连接。

    三、解决方法

      方法一、系统进行资源强制回收System.gc(),解除占用

      但是System.gc()只是通知GC进行垃圾回收,但是啥时GC回收不知道,所以这个方法不一定一次成功,如果一次强制回收不成功,那就搞个循环,多来几次。

    public boolean forceDelete(File file){
            boolean result=file.delete();
            if (!result) {
                System.gc();    //回收资源
                file.delete();
            }
            return result;
     }

      方法二、在Dom4j中关闭流资源

       这里没有以内部类的方式创建InputStream,而是显示创建,然后关流(jdk1.7  try-with-resource语法)。

    public void readXML() {
            SAXReader reader = new SAXReader();
            Document doc = null;
    
            try(FileInputStream fin = new FileInputStream("demo.xml")) {
                doc = reader.read(fin);
                Element root = doc.getRootElement();
    
                /**
                 * 其他代码
                 */
            } catch (DocumentException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    四、建议

      1、创建IO流如果不是特别需要,一般尽量不要使用“匿名内部类”来创建;

      2、使用IO流读取文件,记得要在最后把流关闭了,不然会一直占着文件不放开,并且耗费资源。而且谨记:先创建的流最后关闭,且创建关闭一一对应。

    在全栈的道路上,积极向上、成熟稳重、谦虚好学、怀着炽热的心向前方的走得更远。
  • 相关阅读:
    64位win7下安装Boost 1.59.0 + boost.python 1.59.0 + gccxml + pygccxml + pyplusplus(py++)
    python量化之路:获取历史某一时刻沪深上市公司股票代码及上市时间
    《Python数据分析常用手册》一、NumPy和Pandas篇
    开启防火墙,开启相关已打开端口
    harbor安装(方便内网镜像使用)
    docker+nginx:1.18 搭建局域网文件查看器-目录索引
    docker-ce 安装
    centos7安装python3 (shell)
    批量转换音频文件s48>mp3
    harbor安装简述及故障记录
  • 原文地址:https://www.cnblogs.com/DDgougou/p/11211294.html
Copyright © 2011-2022 走看看