1. 程式人生 > 其它 >try-with-resource 自動關閉 AutoClosable 介面的資源

try-with-resource 自動關閉 AutoClosable 介面的資源

JAVA 中,JVM 的垃圾回收機制可以對內部資源實現自動回收,給開發者帶來了極大的便利。但是 JVM 對外部資源(呼叫了底層作業系統的資源)的引用卻無法自動回收,例如資料庫連線,網路連線以及輸入輸出 IO 流等。這些連線就需要我們手動去關閉,不然會導致外部資源洩露,連線池溢位以及檔案被異常佔用等。JDK7 之後,新增了“ try-with-resource”。它可以自動關閉實現了AutoClosable 介面的類,實現類需要實現 close()方法。”try-with-resources 宣告”,將 try-catch-finally 簡化為 try-catch,這其實是一種語法糖,在編譯時仍然會進行轉化為 try-catch-finally 語句。

常見的實現了AutoCloseable介面的類有:

BufferedInputStream, BufferedOutputStream

BufferedReader, BufferedWriter

FileInputStream, FileOutputStream

FileReader, FileWriter

InputStream, OutputStream

PrintWriter, PrintStream

Reader, Writer

Scanner, SSLServerSocker, SSLSocket等等等等

舉例說明

try–catch-finally 實現
Scanner scanner = null;
try {
    scanner = new Scanner(new File("test.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}
try-with-resources 實現
try (Scanner scanner = new Scanner(new File("testRead.txt")); 
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {

    while (scanner.hasNext()) {
        writer.print(scanner.nextLine());
    }

}catch (FileNotFoundException e) {
    e.printStackTrace();
}