2

我想将base64编码的数据写入文件,即时解码。我有

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

我认为这行得通,在我的finally代码块中,我调用bw.close()了 - 即关闭最外层的 wrapper。这是否足够,或者一些匿名中间对象会泄漏?

我尝试查看代码,但我被 Sun 的 OutputStreamWriter 编码处理程序的专有实现卡住了。它似乎也没有在文档中明确说明。

4

3 回答 3

8

一般来说,关闭最外层的包装就足够了;每个包装器在关闭时都会关闭底层流。

可以创建一个不执行此操作的包装器,但这可能被视为错误,因为文档FilterOutputStream要求调用关闭“释放与流关联的任何系统资源”。

于 2013-09-29T11:44:19.427 回答
3

最好的方法是关闭最外层的流对象。假设它被正确实现,这将调用close()包装的对象,并且关闭将沿着链传播......做正确的事情。

在输出管道的情况下,这样做实际上很重要。如果您只关闭最里面的输出流/写入器,则缓冲输出(管道中的某处)可能无法正确写入。

于 2013-09-29T12:08:52.170 回答
2

由于BufferedWriter 扩展了 AutoClosable,因此您可以使用Java 7 中的 try-with-resources 语句在超出范围时自动关闭资源。

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

      // bw.write(); 

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

try-with-resources 语句确保每个资源在语句结束时关闭

此外,这样代码看起来更干净。

于 2013-09-29T12:22:22.553 回答