一、引言
也許大家在使用流時因為未關閉、或者未正常關閉引發了很多問題。其實java7引入了自動關閉流機制,只是我們未使用而已。
二、自動關閉流例子
public class AutoCloseTest {
public static void main(String[] args) throws IOException {
//將開啟流程式碼放到try中
try (
BufferedReader br = new BufferedReader(
new FileReader("teacher.txt"));
PrintStream pr = new PrintStream(new FileOutputStream("a.txt"))
) {
//使用兩個資源
System.out.println(br.readLine());
pr.println("我是要成為海賊王的男人");
}
}
}
我們直接將開啟的流物件放到try的圓括號中,這樣當流使用完畢時,會自動將流進行關閉。這樣不僅省事而且避免了自行關閉可能帶來的錯誤。
三、探究原理
這麼神奇嗎?讓我們來掀開這層神祕面紗,看看是何方妖孽在此“作祟”。通過jd-gui工具,我們開啟
class檔案看看。
public class AutoCloseTest
{
public static void main(String[] args)
throws IOException
{
BufferedReader br = new BufferedReader(new FileReader("teacher.txt"));Throwable localThrowable6 = null;
try
{
PrintStream pr = new PrintStream(new FileOutputStream("a.txt"));Throwable localThrowable7 = null;
try
{
System.out.println(br.readLine());
pr.println("我是要成為海賊王的男人");
}
catch (Throwable localThrowable1)
{
localThrowable7 = localThrowable1;throw localThrowable1;
}
finally {}
}
catch (Throwable localThrowable4)
{
localThrowable6 = localThrowable4;throw localThrowable4;
}
finally
{
if (br != null) {
if (localThrowable6 != null) {
try
{
br.close();
}
catch (Throwable localThrowable5)
{
localThrowable6.addSuppressed(localThrowable5);
}
} else {
br.close();
}
}
}
}
}
厲害了,jvm幫我們做的更好,大家可以參考下之前自己寫的關閉流程有沒有問題。自動關閉流程也是一樣的,先關閉後開啟的流,因為如果先關閉先開啟的,如果後開啟的在使用先開啟的,這就會引發異常。
為什麼會自動關閉呢?
這是因為java7引入了一個AutoCloseable介面。幾乎java自帶的所有使用到流的都實現了這個介面。下面是繼承圖。
四、總結
我們可以通過使用java7引入的自動關閉機制,將實現了AutoCloseable介面的流放到try塊裡開啟,這樣在使用完畢之後,流會自動正確關閉,從此告別流關閉異常。