釋放模式-JDK7以後帶資源的try構造

在一個長時間運行的程序中,若是未能關閉一個流,則可能會泄露文件句柄,網絡端口和其餘資源。所以在JDK6和更早的版本中,明智的作法實在 finally塊中關閉流。爲了獲得正確的變量做用域,必須在try塊以外聲明流變量,但必須在try內完成初始化。在關閉流以前,須要檢查流變量是否爲 null。最後一般都但願忽略流關閉時出現的異常。或者最多把這些異常記錄在日誌中。例如:
java

     /**
     * jdk7以前的流操做以及關閉關閉
     */
    public void beforeSeven(){
        OutputStream os = null;
        try{
            os = new FileOutputStream("/opt/temp/data");
            //對os流的相應操做
        }catch(IOException ex){
            System.out.println(ex.getMessage());
        }finally{
            if(os!=null)
            try{
                os.close();
            }catch(IOException e){
                //忽略
            }

 }
    }
網絡

這個技術有時會稱做釋放模式,者須要在垃圾回收前釋放對象是很常見的。這個技術不單單適用於流,同時還適用於socket,通道,JDBC鏈接和語句中。
socket


JDK7引入了「帶資源的try'」 構造(try with resource),能夠更簡介的完成清理,不須要在try塊以外聲明流變量,徹底能夠在try塊的一個參數列表中聲明,例如:
ide

/**
     * jdk7以後的流操做以及關閉
     */
    public void afterSereven(){
        try(OutputStream os = new FileOutputStream("/opt/temp/data")){
            //處理流輸出
        }catch(IOException ex){
            System.out.println(ex.getMessage());
        }
    }

代碼變的如此簡介。如今再也不須要finally子句。Java會對try塊參數表中聲明的全部AutoCloseable對象自動調用close()方法。spa


只要對象實現了closeable接口,均可以實現try with resource構造,着包括幾乎全部須要釋放的對象。到目前爲止,JavaMail Transport對象是目前惟一的例外。日誌

相關文章
相關標籤/搜索