在一個長時間運行的程序中,若是未能關閉一個流,則可能會泄露文件句柄,網絡端口和其餘資源。所以在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對象是目前惟一的例外。日誌