2013-09-29 24 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

相关问题