陷阱忘記了免費資源
每次程式開啟資源(例如檔案或網路連線)時,一旦使用完資源,釋放資源非常重要。如果在對此類資源的操作期間丟擲任何異常,則應採取類似的謹慎措施。有人可能會說, FileInputStream
有一個終結器 ,可以在垃圾收集事件中呼叫 close()
方法; 但是,由於我們無法確定垃圾收集週期何時開始,因此輸入流可以無限期地消耗計算機資源。必須在 try-catch 塊的 finally
部分中關閉資源:
Version < Java SE 7
private static void printFileJava6() throws IOException {
FileInputStream input;
try {
input = new FileInputStream("file.txt");
int data = input.read();
while (data != -1){
System.out.print((char) data);
data = input.read();
}
} finally {
if (input != null) {
input.close();
}
}
}
從 Java 7 開始,Java 7 中引入了一個非常有用且簡潔的語句,特別是針對這種情況,稱為 try-with-resources:
Version >= Java SE 7
private static void printFileJava7() throws IOException {
try (FileInputStream input = new FileInputStream("file.txt")) {
int data = input.read();
while (data != -1){
System.out.print((char) data);
data = input.read();
}
}
}
在試穿與資源語句可以使用實現 Closeable
或 AutoCloseable
介面的任何物件使用。它確保在語句結束時關閉每個資源。兩個介面之間的區別在於,Closeable
的 close()
方法丟擲了一個必須以某種方式處理的 IOException
。
如果資源已經開啟但應該在使用後安全關閉,可以將其分配給 try-with-resources 中的區域性變數
Version >= Java SE 7
private static void printFileJava7(InputStream extResource) throws IOException {
try (InputStream input = extResource) {
... //access resource
}
}
在 try-with-resources 建構函式中建立的本地資源變數實際上是最終的。