背景
也許大家在使用流時因為未關閉、或者未正常關閉引發了很多問題。其實java7引入了自動關閉流機制,只是我們未使用而已。
自動關閉流例子
import java.io.*; public class AutoCloseTest { public static void main(String[] args) throws IOException { //將打開流代碼放到try中 try ( BufferedReader br = new BufferedReader(new FileReader("t.txt")); PrintStream pr = new PrintStream(new FileOutputStream("a.txt")) ) { //使用兩個資源 System.out.println(br.readLine()); pr.println("我是要成為海賊王的男人"); } } }
我們直接將打開的流對象放到try的圓括號中,這樣當流使用完畢時,會自動將流進行關閉。這樣不僅省事而且避免了自行關閉可能帶來的錯誤。
打開該源碼文件對應的class文件反編譯后可以看到
import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; public class AutoCloseTest { public AutoCloseTest() { } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("t.txt")); Throwable var2 = null; try { PrintStream pr = new PrintStream(new FileOutputStream("a.txt")); Throwable var4 = null; try { System.out.println(br.readLine()); pr.println("我是要成為海賊王的男人"); } catch (Throwable var27) { var4 = var27; throw var27; } finally { if (pr != null) { if (var4 != null) { try { pr.close(); } catch (Throwable var26) { var4.addSuppressed(var26); } } else { pr.close(); } } } } catch (Throwable var29) { var2 = var29; throw var29; } finally { if (br != null) { if (var2 != null) { try { br.close(); } catch (Throwable var25) { var2.addSuppressed(var25); } } else { br.close(); } } } } }
jvm幫我們做的更好,大家可以參考下之前自己寫的關閉流程有沒有問題。自動關閉流程也是一樣的,先關閉后打開的流,因為如果先關閉先打開的,如果后打開的在使用先打開的,這就會引發異常。
為什么會自動關閉
因為java7引入了一個AutoCloseable接口。幾乎java自帶的所有使用到流的都實現了這個接口。下面是繼承圖。
總結
Java版本支持的情況下,可通過使用java7引入的自動關閉機制,將實現了AutoCloseable接口的流放到try塊里打開,這樣在使用完畢之后,流會自動正確關閉,從此告別流關閉異常。