Java解除文件占用即Dom4j操作后實現(xiàn)xml關流
一、背景
項目中要解析xml,由于Dom4j的諸多優(yōu)點,我就用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,你會發(fā)現(xiàn),不管是SAXReader,還是Document,都沒有提供關閉流資源的操作,我當時天真的以為Dom4j自動關閉流資源了,不用我們再關流了。
后來的某一天,由于業(yè)務的需要,需要在程序中刪除此xml,我發(fā)現(xiàn)不管我用file.deleteOnExit(),還是用file.delete()。都刪除不了此xml文件,顯示文件被占用,無法刪除,我自己用鼠標去刪除,也是顯示“操作無法完成 因為文件已在 Java™ Platform SE binary 中打開”,至此才發(fā)現(xiàn)Dom4j沒有關閉流資源,Dom4j當時給我的是幻覺,幸好線上xml文件不是特別多,不然要出生產(chǎn)事故了。
二、原因
Dom4j解析完xml沒有關閉連接。
三、解決方法
方法一、系統(tǒng)進行資源強制回收System.gc(),解除占用
但是System.gc()只是通知GC進行垃圾回收,但是啥時GC回收不知道,所以這個方法不一定一次成功,如果一次強制回收不成功,那就搞個循環(huán),多來幾次。
public boolean forceDelete(File file){ boolean result=file.delete(); if (!result) { System.gc(); //回收資源 file.delete(); } return result; }
方法二、在Dom4j中關閉流資源
這里沒有以內部類的方式創(chuàng)建InputStream,而是顯示創(chuàng)建,然后關流(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、創(chuàng)建IO流如果不是特別需要,一般盡量不要使用“匿名內部類”來創(chuàng)建;
2、使用IO流讀取文件,記得要在最后把流關閉了,不然會一直占著文件不放開,并且耗費資源。而且謹記:先創(chuàng)建的流最后關閉,且創(chuàng)建關閉一一對應。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
mybatis if test 不為空字符串或null的解決
這篇文章主要介紹了mybatis if test 不為空字符串或null的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11idea 在springboot中使用lombok插件的方法
這篇文章主要介紹了idea 在springboot中使用lombok的相關資料,通過代碼給大家介紹在pom.xml中引入依賴的方法,本文給大家介紹的非常詳細,需要的朋友可以參考下2021-08-08maven的pom.xml中repositories和distributionManagement使用
這篇文章主要介紹了maven的pom.xml中repositories和distributionManagement使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03Java中replace、replaceAll和replaceFirst函數(shù)的用法小結
相信會java的同學估計都用過replace、replaceAll、replaceFirst這三個函數(shù),可是,我們真的懂他們嗎?下面通過這篇文章大家再來好好學習學習下這幾個函數(shù)。2016-09-09詳解Spring Cloud Config采用Git存儲時兩種常用的配置策略
這篇文章主要介紹了詳解Spring Cloud Config采用Git存儲時兩種常用的配置策略,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07