您好,登錄后才能下訂單哦!
一、背景
項(xiàng)目中要解析xml,由于Dom4j的諸多優(yōu)點(diǎn),我就用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,你會(huì)發(fā)現(xiàn),不管是SAXReader,還是Document,都沒(méi)有提供關(guān)閉流資源的操作,我當(dāng)時(shí)天真的以為Dom4j自動(dòng)關(guān)閉流資源了,不用我們?cè)訇P(guān)流了。
后來(lái)的某一天,由于業(yè)務(wù)的需要,需要在程序中刪除此xml,我發(fā)現(xiàn)不管我用file.deleteOnExit(),還是用file.delete()。都刪除不了此xml文件,顯示文件被占用,無(wú)法刪除,我自己用鼠標(biāo)去刪除,也是顯示“操作無(wú)法完成 因?yàn)槲募言?Java™ Platform SE binary 中打開(kāi)”,至此才發(fā)現(xiàn)Dom4j沒(méi)有關(guān)閉流資源,Dom4j當(dāng)時(shí)給我的是幻覺(jué),幸好線上x(chóng)ml文件不是特別多,不然要出生產(chǎn)事故了。
二、原因
Dom4j解析完xml沒(méi)有關(guān)閉連接。
三、解決方法
方法一、系統(tǒng)進(jìn)行資源強(qiáng)制回收System.gc(),解除占用
但是System.gc()只是通知GC進(jìn)行垃圾回收,但是啥時(shí)GC回收不知道,所以這個(gè)方法不一定一次成功,如果一次強(qiáng)制回收不成功,那就搞個(gè)循環(huán),多來(lái)幾次。
public boolean forceDelete(File file){ boolean result=file.delete(); if (!result) { System.gc(); //回收資源 file.delete(); } return result; }
方法二、在Dom4j中關(guān)閉流資源
這里沒(méi)有以內(nèi)部類(lèi)的方式創(chuàng)建InputStream,而是顯示創(chuàng)建,然后關(guān)流(jdk1.7 try-with-resource語(yǔ)法)。
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流如果不是特別需要,一般盡量不要使用“匿名內(nèi)部類(lèi)”來(lái)創(chuàng)建;
2、使用IO流讀取文件,記得要在最后把流關(guān)閉了,不然會(huì)一直占著文件不放開(kāi),并且耗費(fèi)資源。而且謹(jǐn)記:先創(chuàng)建的流最后關(guān)閉,且創(chuàng)建關(guān)閉一一對(duì)應(yīng)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。