只需關閉最外層流,內層被裝飾流會自動關閉。 關閉順序無影響,但習慣上從外層往內層關閉(或僅關閉外層)。
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,緩衝區資料可能丟失。// Java 7+ 標準寫法,自動處理巢狀關閉、異常抑制
try (FileWriter fw = new FileWriter("test.txt");
BufferedWriter bw = new BufferedWriter(fw)) {
bw.write("Hello");
} // 編譯器自動生成 finally { bw.close(); fw.close(); } 等效代碼