1. 程式人生 > 其它 >Java自動關閉流

Java自動關閉流

背景

也許大家在使用流時因為未關閉、或者未正常關閉引發了很多問題。其實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塊裡開啟,這樣在使用完畢之後,流會自動正確關閉,從此告別流關閉異常。