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塊里打開,這樣在使用完畢之后,流會自動正確關閉,從此告別流關閉異常。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM