一、背景

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

java怎么解除文件占用(Dom4j操作完xml后怎么关流)的更多相关文章

  1. c# 删除程序占用的文件,强力删除文件,彻底删除文件,解除文件占用

    c# 删除程序占用的文件.清理删除文件.彻底删除文件,解除文件占用 文件打开时,以共享读写模式打开 FileStream inputStream = new FileStream(name, File ...

  2. Windows下强制删除文件或文件夹(解除文件占用/Unlock)

    前言 在windows下,有时候会碰到一些文件无法删除,尽量使用“管理员取得所有权” ,但文件或文件夹依然无法删除,这一点非常苦恼. 本文记录几款可以解锁文件占用的软件. ProcessHacker ...

  3. Java读取txt文件信息并操作。

    一.java读取txt文件内容 import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.Fi ...

  4. java 对同一个文件进行读写操作

    同一个文件是不可以进行同时的读写的,因为我们写入文件会覆盖原文件的,如果这样,对于同一文件来来说,文件发生覆盖,无法进行下次读取 当然,对于两个不同的文件,可以一边读一边写的操作 题目:一个文本中存储 ...

  5. 用Java对CSV文件进行读写操作

    需要jar包:javacsv-2.0.jar 读操作 // 读取csv文件的内容 public static ArrayList<String> readCsv(String filepa ...

  6. JAVA简单的文件I/O操作实例

    如果只是对文件进行普通的读写,可以不用文件流. 以下是实例: File file = new File("test1.txt"); //向文件写入数据的 PrintWriter p ...

  7. c#+handle.exe实现升级程序在运行时自动解除文件被占用的问题

    我公司最近升级程序经常报出更新失败问题,究其原因,原来是更新时,他们可能又打开了正在被更新的文件,导致更新文件时,文件被其它进程占用,无法正常更新而报错,为了解决这个问题,我花了一周时间查询多方资料及 ...

  8. Java进阶(二十七)使用Dom4j解析XML文件

    使用Dom4j解析XML文件 写在前面的话 由于论文实验要求,需要实现操作XML文档,为此想到了dom4j这个工具,使用之后深感受益.在此分享给大家,以此共勉. 注:本文转载自http://blog. ...

  9. Java 读写XML文件 API--org.dom4j

    om4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,同时它也是一个开放源代码的软件 ...

随机推荐

  1. 使用vagrant一键部署本地php开发环境(一)

    一:我们为什么需要用这玩意 我们在开发中经常会面临的问题:环境不一致,有人用Mac有人用Windos还有几个用linux的,而我们的服务器都是linux.    在我本地是可以的啊,我测了都,没有问题 ...

  2. git仓库与项目源码分离

    在服务器上初始化git仓库 cd mkdir gitrepo cd gitrepo git init --bare runoob.git 本地 若是已经有git项目了,直接添加一个仓库地址就行了 gi ...

  3. 常见浏览器userAgent请求头信息

    if (browser.versions.mobile) {//判断是否是移动设备打开.browser代码在下面 var ua = navigator.userAgent.toLowerCase(); ...

  4. [Java读书笔记] Effective Java(Third Edition) 第 5 章 泛型

    第 26 条:请不要使用原生态类型 声明中具有一个或多个类型参数的类或者接口,就是泛型(generic). 例如List接口只有单个类型参数E, 表示列表的元素类型.这个接口全称List<E&g ...

  5. windows/Linux 下安装coreseek/sphinx

    2013年12月8日 17:26:26 注意的地方: 1.配置文件的 数据源, 索引, 服务 这3处配置的路径要写成windows识别的路径,最好是绝对路径 2.安装windows服务的时候,可以不带 ...

  6. MySQL SSL配置(mysql5.7和mysql5.6)

    专题一:mysql5.7上开启并配置ssl [root@mysqlmaster01 bin]# ./mysql_ssl_rsa_setup --datadir=/data/mysql_data1/ - ...

  7. 将springboot安装成windows服务启动。

    下载Windows Service Wrapper 本文下载了winsw-2.3.0-bin.exe. 新建一个目录aiplatformService 在目录里面新建一个aiplatformServi ...

  8. 使用STM32F103ZET霸道主板实现SD卡的读写(非文件系统)

    了解STM32F103ZET是高容量多管脚的芯片 了解SD读写线路图 了解SD的基地址 阅读STM32F10xx英文参考 SDIO那章,我们编写代码边看文档解析 建工程,打开包含所有包括外设库函数的样 ...

  9. [Tensorflow] 使用 Mask_RCNN 完成目标检测与实例分割,同时输出每个区域的 Feature Map

    Mask_RCNN-2.0 网页链接:https://github.com/matterport/Mask_RCNN/releases/tag/v2.0 Mask_RCNN-master(matter ...

  10. C#进阶系列—WebApi

    参考学习优秀博客地址:http://www.cnblogs.com/landeanfen/p/5177176.html