java 文件占用_java怎么解除文件占用(Dom4j操作完xml后怎么关流)

一、背景

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

public voidreadXML() {

SAXReader reader= newSAXReader();

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 booleanforceDelete(File file){boolean result=file.delete();if (!result) {

System.gc();//回收资源

file.delete();

}returnresult;

}

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

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

public voidreadXML() {

SAXReader reader= newSAXReader();

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流读取文件,记得要在最后把流关闭了,不然会一直占着文件不放开,并且耗费资源。而且谨记:先创建的流最后关闭,且创建关闭一一对应。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值