Java解除文件占用即Dom4j操作后实现xml关流

  

<强>一、背景

  

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

        公共空间readXML () {   SAXReader读者=new SAXReader ();   文档doc=零;      尝试{   医生=读者。读(新文件(“demo.xml”));   根元素=doc.getRootElement ();/* *   *其他代码   */}捕捉(DocumentException e) {   e.printStackTrace ();   }   }      

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

  

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

  

<强>二,原因

  

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

  

<强>三,解决方法

  

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

  

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

        公共布尔forceDelete(文件文件){   布尔结果=file.delete ();   如果结果(!){   system . gc ();//回收资源   file.delete ();   }   返回结果;   }      

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

  

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

        公共空间readXML () {   SAXReader读者=new SAXReader ();   文档doc=零;      尝试新(FileInputStream鳍=FileInputStream (“demo.xml”)) {   医生=reader.read(鳍);   根元素=doc.getRootElement ();/* *   *其他代码   */}捕捉(DocumentException e) {   e.printStackTrace ();   }捕捉(FileNotFoundException e) {   e.printStackTrace ();   }捕捉(IOException e) {   e.printStackTrace ();   }   }      

<强>四、建议

  

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

  

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

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

Java解除文件占用即Dom4j操作后实现xml关流