91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java解除文件占用即Dom4j操作后實現xml關流

發布時間:2020-09-16 09:59:41 來源:腳本之家 閱讀:234 作者:Erneste 欄目:編程語言

一、背景

  項目中要解析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流讀取文件,記得要在最后把流關閉了,不然會一直占著文件不放開,并且耗費資源。而且謹記:先創建的流最后關閉,且創建關閉一一對應。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

军事| 昌吉市| 双鸭山市| 北票市| 南投市| 石台县| 涿州市| 天长市| 柳江县| 湾仔区| 教育| 莎车县| 清涧县| 花莲县| 航空| 牟定县| 邹平县| 银川市| 江都市| 苗栗市| 晋江市| 乡城县| 阿克陶县| 吉林市| 三明市| 南阳市| 巧家县| 康平县| 玉环县| 胶南市| 桃江县| 博爱县| 龙岩市| 射阳县| 紫云| 双流县| 瑞昌市| 镇江市| 格尔木市| 浏阳市| 怀仁县|