try-with-resource 自動關閉 AutoClosable 介面的資源
阿新 • • 發佈:2022-12-03
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();
}