时间:2021-05-20
一、背景
项目中要解析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流读取文件,记得要在最后把流关闭了,不然会一直占着文件不放开,并且耗费资源。而且谨记:先创建的流最后关闭,且创建关闭一一对应。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
dom4j是Java的XMLAPI,用来读写XML文件的。目前有很多场景中使用dom4j来读写xml的。要使用dom4j开发,需要下载导入dom4j相应的jar
dom4j是一个Java的XMLAPI,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的JavaXMLAPI,具有性能优异、功能强大和极端易
dom4j是一个Java的XMLAPI,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的JavaXMLAPI,具有性能优异、功能强大和极端易
本文实例讲述了java基于dom4j包实现对XML解析的方法。分享给大家供大家参考,具体如下:本例中的xml文件内容如下:Java解析XML代码如下:packa
其实解析xml文件有四种方式:DOM,JDOM,DOM4J,SAX。我们来说与平台无关的两种官方解析方式:DOM和SAX一、DOM解析在Java代码中,xml文