1. 程式人生 > 實用技巧 >java中流關閉及帶資源的try語句(try-with-resource)作用

java中流關閉及帶資源的try語句(try-with-resource)作用

一、IO流關閉順序

程式碼示例:

    public static void saveBase64(String data, String path, Long name) {
        OutputStreamWriter ops = null;
        BufferedWriter bw = null;
        File file;
        try {
            file = new File(path, name + ".txt");
            ops = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8);
            bw 
= new BufferedWriter(ops); bw.append("data:image/jpg;base64," + data); } catch (Exception e) { LOG.error(e.getMessage(), e); e.printStackTrace(); } finally { try {if (bw != null) { bw.flush(); bw.close(); } }
catch (Exception e) { LOG.error(e.getMessage(), e); e.printStackTrace(); } } }

1.包裝流(處理流)和節點流關閉

概念:

如果一個流的構造方法中需要傳入流,那麼這傳入流稱為“節點流”,此處的OutputStreamWriter就是節點流。

外部負責包裝的流,稱為:包裝流,也可以叫做處理流,BufferedWriter就是包裝流。

關閉:

包裝流的關閉,只需要關閉包裝流即可,包裝流的close方法會自動將節點流也關閉。

2.按順序關閉流

如果按順序關閉流,是從內層流到外層流關閉還是從外層到內層關閉?

一般情況下是:先開啟的後關閉,後開啟的先關閉

另一種情況:看依賴關係,如果流a依賴流b,應該先關閉流a,再關閉流b

例如處理流a依賴節點流b,應該先關閉處理流a,再關閉節點流b

當然完全可以只關閉處理流,不用關閉節點流。處理流關閉的時候,會呼叫其處理的節點流的關閉方法

如果將節點流關閉以後再關閉處理流,會丟擲IO異常;

二、try(){}語法含義

程式碼示例:

 private static void saveBase64(String data, String path, Long name) {
        File file;
        file = new File(path, name + ".txt");

        try (OutputStreamWriter ops = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8);
             BufferedWriter bw = new BufferedWriter(ops)) {
            bw.append("data:image/jpg;base64,").append(data);
        } catch (Exception e) {
            LOG.error("儲存圖片異常:{}", e.getMessage());
        }
    }

try塊退出時,會自動呼叫res.close()方法,關閉資源。不用寫一大堆finally來關閉資源。

所有實現Closeable的類宣告都可以寫在裡面,最常見於流操作,socket操作,新版的httpclient也可以;

需要注意的是,try()的括號中可以寫多行宣告,每個宣告的變數型別都必須是Closeable的子類,用分號隔開

參考:

1.IO 包裝流關閉

2.java中帶引數的try(){}語法含義是什麼?