首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java IO 流關閉原則:裝飾模式下的正確姿勢

     編輯:程式設計綜合問答

核心結論

只需關閉最外層流,內層被裝飾流會自動關閉。 關閉順序無影響,但習慣上從外層往內層關閉(或僅關閉外層)。

原理分析

FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
// ...
bw.close(); // 內部會呼叫 fw.close()

BufferedWriter.close() 原始碼片段:

public void close() throws IOException {
    synchronized (lock) {
        if (out == null) return;
        try { flushBuffer(); } finally { out.close(); } // 關閉被包裝流
        out = null;
        cb = null;
    }
}

各種情況對照

建立方式正確關閉方式說明
BufferedWriter bw = new BufferedWriter(new FileWriter(f));bw.close();僅關閉外層 bw 即可
FileWriter fw = new FileWriter(f); BufferedWriter bw = new BufferedWriter(fw);bw.close(); 或 fw.close(); bw.close();關閉外層自動關閉內層;重複關閉無害
try-with-resources (Java 7+)try (BufferedWriter bw = new BufferedWriter(new FileWriter(f))) { ... }編譯器自動生成正確關閉代碼,推薦

常見誤區

  • 「必須分別關閉」:錯誤,會導致碼冗餘且若順序反向可能拋異常(內層已關閉再關外層)。
  • 「關閉內層後外層自動關閉」:錯誤,fw.close() 不會自動關閉包裝它的 bw,緩衝區資料可能丟失。

最佳實踐:try-with-resources

// Java 7+ 標準寫法,自動處理巢狀關閉、異常抑制
try (FileWriter fw = new FileWriter("test.txt");
     BufferedWriter bw = new BufferedWriter(fw)) {
    bw.write("Hello");
} // 編譯器自動生成 finally { bw.close(); fw.close(); } 等效代碼

參考資源

Java Practices: Close streams

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved