2013-09-29 84 views
2

我想將base64編碼的數據寫入文件,實時解碼。我有我必須關閉這些包裝的Java I/O對象中的多少個?

BufferedWriter bw = new BufferedWriter(
    new OutputStreamWriter(
    new Base64OutputStream(
     new FileOutputStream(myFile, false))); 

我想這樣的作品,在我finally塊我稱之爲bw.close() - 那就是,close the outermost wrapper。這足夠了,還是一些匿名中介對象會泄漏?

我試着翻看代碼,但是我被卡在Sun的專有的OutputStreamWriter的編碼處理程序的實現中。它也似乎沒有在文檔中明確闡述。

+3

Dup:http://stackoverflow.com/questions/6586866/closing-nested-streams和:http://stackoverflow.com/questions/8080649/do-i-have-to-close-fileoutputstream- which-is-wrapped-by-printstream – sara

+0

我不知道爲什麼我找不到那些。謝謝@sara! – Coderer

回答

8

一般來說,封閉最外層的包裝紙就足夠了;每個封套在封閉時關閉封套流。

它可以創建一個包裝不這樣做,但可以考慮,因爲對於FilterOutputStream文檔中的錯誤需要一個電話,收"releases any system resources associated with the stream."

+1

我知道打破這個規則的唯一類是'ZipOutputStream',它在調用'#close()'之前需要關閉單獨的條目。 – Esko

3

最好的辦法是關閉最外層流目的。假設它被正確地實現,這將在包裝的對象上調用close(),並且關閉會傳播鏈條......做正確的事情。

在輸出管線的情況下,它實際上是你做這種方式重要。如果只關閉最內層的輸出流/寫入器,緩衝輸出(流水線中的某處)可能無法正確寫入。

2

由於BufferedWriter extends AutoClosable,您可以使用try-with-resources statement在Java 7中,當他們超出範圍自動關閉資源。

try(BufferedWriter bw = new BufferedWriter(
    new OutputStreamWriter(
    new Base64OutputStream(
     new FileOutputStream(myFile, false))); 
    ) { 

     // bw.write(); 

} catch(XXXException ex) { 
    // Catch Block. 
} 

試戴與資源語句確保每個資源在聲明

此外,代碼看起來更清潔這種方式結束時關閉。

+0

至少在可預見的未來,我必須支持Java 6。不過,我一定寧願這樣做。 – Coderer

相關問題