一、背景

  项目中要解析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. WIN7+Qt5.2.0连接oracle数据库的oci驱动的编译

    一.前提安装 1.需要安装QT5.2.0,本介绍安装的是qt-windows-opensource-5.2.0-mingw48_opengl-x86-offline.exe: 本文安装目录:c:\Qt ...

  2. linux下怎么用ssh连接另一台linux服务器

    linux系统大家都知道是服务器版本一般都没有图像界面,通过字符界面操作.用ssh远程方式远程,如果要从一台linux远程到另外一台系统应该怎么操作呢本经验咗嚛以cenots7为例演示   方法/步骤 ...

  3. android设置gps自动开启

    1.第一种方法 private void toggleGPS() { Intent gpsIntent = new Intent(); gpsIntent.setClassName("com ...

  4. 11 Flutter仿京东商城项目 商品列表页面二级筛选导航布局

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  5. ES6深入浅出-1 新版变量声明:let 和 const-2.视频 let和const

    以前的var方式声明不好用 a=1回声明一个全局变量, 输出了1 说明a=1确实声明了一个全局变量. 但是你把放在其他的地方,就不是声明全局变量了. 如果外面有个全局变量a 那么函数里面就是给a赋值 ...

  6. nc简单使用

    1.安装 2.运行

  7. Carthage - Could not find any available simulators for iOS

    升级xcode版本后,用carthage编译第三方库有可能会报这个错误:[Could not find any available simulators for iOS] 两个解决方法: 1. 升级你 ...

  8. 【leetcode】507. Perfect Number

    problem 507. Perfect Number solution: /* class Solution { public: bool checkPerfectNumber(int num) { ...

  9. swift 第一课 基础知识-1

    1. 基本的打印: print("这是学习 swift 的第一课") var varA = print("a 的值是 \(varA)") //注:字符串打印参数 ...

  10. RESTful架构(Representational State Transfer资源表现层状态转换)

    1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...