Java 流中 flush() 的目的是啥?

Posted

技术标签:

【中文标题】Java 流中 flush() 的目的是啥?【英文标题】:What is the purpose of flush() in Java streams?Java 流中 flush() 的目的是什么? 【发布时间】:2011-01-21 08:35:48 【问题描述】:

在 Java 中,flush() 方法用于流中。但是我不明白使用这种方法的全部目的是什么?

fin.flush();

告诉我一些建议。

【问题讨论】:

【参考方案1】:

来自flush方法的docs:

刷新输出流并强制写出任何缓冲的输出字节。 flush 的一般约定是调用它表示,如果先前写入的任何字节已被输出流的实现缓冲,则应立即将这些字节写入其预期目的地。

缓冲主要是为了提高 I/O 性能。更多信息可以阅读这篇文章:Tuning Java I/O Performance。

【讨论】:

调整 Java I/O 性能oracle.com/technetwork/articles/javase/perftuning-137844.html的新链接 +1 谢谢。我不知道为什么我的字节没有被发送出去,那是因为我必须刷新我的缓冲区。 flush 方法是否仅用于缓冲流?将它与其他流(例如输出流)一起使用有什么好处吗? 也许“flush”这个词不应该出现在它的定义中。递归定义对于理解新事物是个坏主意。我知道你没有写定义。【参考方案2】:

当您将数据写入流时,它不会立即写入,而是被缓冲。因此,当您需要确保缓冲区中的所有数据都已写入时,请使用flush()

我们需要确保在关闭流之前完成所有写入,这就是为什么在文件/缓冲写入器的close() 中调用flush()

但如果您要求在关闭流之前随时保存所有写入,请使用flush()

【讨论】:

在 close 之前调用 flush 是多余的,对吧?和简单地调用close一样。 @BimanTripathy 我可以 100% 保证。它由FilterOutputStreamFilterWriter 的Javadoc 保证。【参考方案3】:

当我们发出任何命令时,该命令的流都会存储在我们计算机中称为缓冲区的内存位置(临时内存位置)中。当所有临时内存位置已满时,我们使用 flush(),它刷新所有数据流并完全执行它们,并为缓冲区临时位置中的新流提供新空间。 -希望你能理解

【讨论】:

仅适用于BufferedOutputStreamBufferedWriterObjectOutputStream,PrintXXX 类。任何其他流的flush() 方法或Writer 什么都不做。 @EJP 有没有备份您的陈述的参考资料?这对我们新手会有帮助:) @mr5 是发帖人需要支持他的陈述,而不是我,但我所说的一切都在 Javadoc 中明确说明 BufferedWriter 不需要显式调用flush(),只要您close() 作者即可。 close() 自己执行刷新。 注意close() 调用flush(),所以在使用FileWriter 没有缓冲区时调用两者都是多余的。【参考方案4】:

如果缓冲区已满,所有在其上缓冲的字符串都会被保存到磁盘上。缓冲区用于避免大交易!和开销。

在 Java 库中的 BufferedWriter 类中,有这样一行:

private static int defaultCharBufferSize = 8192;

如果您确实想在缓冲区已满之前发送数据,您可以控制。只是冲洗它。对 writer.flush() 的调用说,“现在发送缓冲区中的任何内容!

参考书:https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

页数:453

【讨论】:

【参考方案5】:

流通常由定期清空其内容的线程访问,例如,将其显示在屏幕上、将其发送到套接字或将其写入文件。这样做是出于性能原因。刷新输出流意味着您要停止,等待流的内容完全传输到其目的地,然后在流为空并发送内容的情况下继续执行。

【讨论】:

这是幻想。流不会被任何神奇的线程访问;仅由应用程序创建。【参考方案6】:

出于性能问题,首先将数据写入 Buffer。当缓冲区已满时,数据将写入输出(文件、控制台等)。当缓冲区部分填充并且您想将其发送到输出(文件,控制台)时,您需要手动调用 flush() 方法以便将部分填充的缓冲区写入输出(文件,控制台)。

【讨论】:

这不是真的。 FileOutputStream.flush() 是一个空的空操作。【参考方案7】:

除了这里的其他好答案之外,这个解释对我来说很清楚:

缓冲区是内存中用于存储数据流的部分 (人物)。这些字符有时只会被发送到 当缓冲区已满或满足 一定数量的字符。这可能会导致您的系统滞后,如果您 只需将几个字符发送到输出设备。冲洗() 方法将立即将缓冲区的内容刷新到输出 流。

来源:https://www.youtube.com/watch?v=MjK3dZTc0Lg

【讨论】:

以上是关于Java 流中 flush() 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Java 输出流中的flush方法

java的io流中,啥时候应该在流关闭之前加flush,啥时候不用

有关Java中流的flush方法

java的io流中,啥时候应该在流关闭之前加flush,啥时候不用

在 java 对象中覆盖哈希码的目的是啥? [复制]

Java中缓冲区的目的是啥?