Java解除文件占用即Dom4j操作后实现xml关流
作者:Erneste 发布时间:2022-07-05 19:18:35
一、背景
项目中要解析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流读取文件,记得要在最后把流关闭了,不然会一直占着文件不放开,并且耗费资源。而且谨记:先创建的流最后关闭,且创建关闭一一对应。
来源:https://www.cnblogs.com/DDgougou/p/11211294.html


猜你喜欢
- 本文实例讲述了Spring与Struts整合之让Spring管理控制器操作。分享给大家供大家参考,具体如下:一 Web配置<?xml
- 使用场景当遇到需要临时修改的 bug,但当前正在开发的内容不能删掉,这个时候就需要把当前已经开发的代码另外保存下来(即保存现场),当把 bu
- 在C#中调用C(C++)类的DLL的时候,有时候C的接口函数包含很多参数,而且有的时候这些参数有可能是个结构体,而且有可能是结构体指针,那么
- 介绍线段树(又名区间树)也是一种二叉树,每个节点的值等于左右孩子节点值的和,线段树示例图如下以求和为例,根节点表示区间0-5的和,左孩子表示
- 本文实例讲述了Android播放器MediaPlayer实现均衡器效果。分享给大家供大家参考,具体如下:这几天在系统学习Android官方A
- 目录微服务微服务架构SpringCould简介环境搭建1. 创建数据库2. 新建一个子模块api3. 新建一个子模块provider作为服务
- 需求描述 今日需求是删除资源时同时删除与该资源绑定的角色数据,有两张表,资源表、
- 本文运用图片给大家介绍了C#如何检查foreach判读其是否为null,我们下面话不多说,直接来看内容吧。1、foreach遍历列表或数组时
- 项目中有这样一个需求,网页上上传了一个视频,需要获取此视频的时长、大小,把这两个数据返回给前
- gateway网关与前端请求的跨域问题最近因项目需要,引入了gateway网关。可是发现将前端请求的端口指向网关后,用postman发送请求
- GridView基础新建一个HelloGridView的工程修改main.xml代码如下:<?xml version="1.
- 右击有main方法的类===> Run as===> Run Configurations ===>双击java
- Collection继承、实现关系如下(说明(I)表示接口, (C)表示Java类,<--表示继承,<<——表示实现):(
- gradle文件执行流程做过Android开发的同学都知道 ,Android项目中存在三个gradle文件,那你是否知道他们的执行流程呢?请
- 用途:IO工具类(将内容写到流中)使用场景IO工具类只是辅助流的读写,并不负责关闭流。原因是流可能被多次读写,读写关闭后容易造成问题。项目引
- Controller层和Service层的类报错当出现以下这种情况的时候,可以看看pom.xml文件中是否少了jar包。当我出现这种情况的时
- 这篇文章主要介绍了dotnet core链接mongodb代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 一、背景当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系
- 在搜索引擎的开发中,我们需要对Html进行解析。本文介绍C#解析HTML的两种方法。AD: 在搜索引擎的开发中,我们需要对网页的Html内容
- 本文实例讲述了JAVA中AES加密方法。分享给大家供大家参考。具体如下:java代码:KeyGenerator kg = KeyGenera