在close()之前使用flush()

Siv*_*lam 46 java iostream

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

Boz*_*zho 30

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

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

  • Upvoted.实际上,任何人都不应该假设所有`close()`也调用`flush()`. (5认同)

Pet*_*rey 29

在编写必须发送的内容之后,开发人员养成了调用flush()的习惯.

恕我直言使用flush()然后close()是很常见的,例如

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

// finished
out.close();
Run Code Online (Sandbox Code Playgroud)

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

  • 冗余+模式=反模式? (13认同)
  • 根据实现类,这可能不是多余的.例如,如果someinterface.getOutputStream()返回一个OutputStream,您可能不知道close方法是否调用flush或者flush方法是否为空,如果没有明确记录.例如URLConnection.getOutputStream():https://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html#getOutputStream-- (10认同)

Fab*_*ian 8

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

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

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

这同样适用一般多为任何实现FlushableCloseable。一个突出的例子是java.io.PrintWriter。它的close()方法不会调用flush().
(点击链接查看源代码)

这可能解释了为什么开发人员flush()在关闭他们的流之前谨慎地调用。我个人遇到过生产错误,其中close()在没有首先调用flush().