根据java文档,在任何java.io Streams上调用close()会自动调用flush()。但是我已经在很多例子中看到过,即使在生产代码中,开发人员也在close()之前明确使用了flush()。在什么条件下我们需要在close()之前使用flush()?
答案 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()
。
(点击链接查看源代码)
对于Flushable
和Closeable
的任何实现,通常更是如此。一个突出的例子是java.io.PrintWriter。其close()
方法不会调用flush()
。
(点击链接查看源代码)
这也许可以解释为什么开发人员在关闭流之前会谨慎地调用flush()
。我个人遇到过生产错误,其中在PrintWriter实例上调用close()
而不先调用flush()
。
答案 3 :(得分:1)
已经提供的答案给出了有趣的见解,我将尝试编译 在这里。
Closeable
和Flushable
是两个独立的特征,Closeable
没有指定close()
应该调用flush()
。这意味着由实现的文档(或代码)决定是否调用flush()
。在大多数情况下,这是准则,但没有保证。
现在有关@Fabian的内容:确实,java.io.PrintWriter
的{{1}}方法未调用close()
。但是,它称为flush()
(out.close()
是基础编写者)。假设out
是out
,我们很好,因为BufferedWriter
正在刷新(根据其文档)。如果是另一位作家,情况可能并非如此……
因此,您有两种选择:
BufferedWriter.close()
,您就始终处于安全状态。需要较少工作的解决方案2是我的首选。