在close()之前使用flush()

时间:2012-03-25 07:10:10

标签: java iostream

根据java文档,在任何java.io Streams上调用close()会自动调用flush()。但是我已经在很多例子中看到过,即使在生产代码中,开发人员也在close()之前明确使用了flush()。在什么条件下我们需要在close()之前使用flush()?

4 个答案:

答案 0 :(得分:30)

我想在很多情况下,因为他们不知道close()也会调用flush(),所以他们想要安全。

无论如何,使用缓冲流应该使手动刷新几乎是多余的。

答案 1 :(得分:27)

开发人员习惯在写完必须发送的内容后调用flush()。

恕我直言使用flush(),然后在刚刚进行了写操作时,close()很常见。

// write a message
out.write(buffer, 0, size);
out.flush();

// finished
out.close();

正如您所看到的,flush()是多余的,但意味着您正在遵循模式。

答案 2 :(得分:1)

我想指出一个重要的概念,以前的许多评论都提到过:

流的close()方法不一定 调用flush()

例如org.apache.axis.utils.ByteArray#close()不调用flush()
 (点击链接查看源代码)

对于FlushableCloseable的任何实现,通常更是如此。一个突出的例子是java.io.PrintWriter。其close()方法不会调用flush()
(点击链接查看源代码)

这也许可以解释为什么开发人员在关闭流之前会谨慎地调用flush()。我个人遇到过生产错误,其中在PrintWriter实例上调用close()而不先调用flush()

答案 3 :(得分:1)

已经提供的答案给出了有趣的见解,我将尝试编译  在这里。

CloseableFlushable是两个独立的特征,Closeable没有指定close()应该调用flush()。这意味着由实现的文档(或代码)决定是否调用flush()。在大多数情况下,这是准则,但没有保证。

现在有关@Fabian的内容:确实,java.io.PrintWriter的{​​{1}}方法未调用close()。但是,它称为flush()out.close()是基础编写者)。假设outout,我们很好,因为BufferedWriter正在刷新(根据其文档)。如果是另一位作家,情况可能并非如此……

因此,您有两种选择:

  • 您要么确保至少一个内部Writer / Stream自身刷新(请注意在代码重构的情况下),
  • 或者您只需打BufferedWriter.close(),您就始终处于安全状态。

需要较少工作的解决方案2是我的首选。