Java流中flush()的目的是什么?


121

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

fin.flush();

告诉我一些建议。

Answers:


101

从该方法的文档flush

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

缓冲主要是为了提高I / O性能。有关更多信息,请参见本文:调整Java I / O性能



+1谢谢。我不知道为什么不发送字节,这是因为我必须刷新缓冲区。
rayryeng 2014年

3
刷新方法是否仅用于缓冲流?将它与其他流(例如outputstream)一起使用是否有任何优势?
tnishada '16

也许“冲洗”一词不应该包含在其定义中。递归定义对于理解新事物是一个坏主意。我知道您没有写定义。
乔纳森·科马尔

27

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


1
只有在的情况下BufferedOutputStreamBufferedWriterObjectOutputStream,PrintXXX类。flush()任何其他流的方法或Writer不执行任何操作。
罗恩侯爵,2015年

@EJP是否有引用来备份您的语句?这对我们的新手会有所帮助:)
mr5 2015年

1
@ MR5是谁需要备份自己的声明,不是我的海报,但一切我已经说过在javadoc明确指出
洛恩侯爵

只要您是作家,就flush()不需要显式调用。本身执行刷新。BufferedWriterclose()close()
Yossarian42

注意close()调用flush(),因此在FileWriter不使用缓冲区的情况下调用两者都是多余的。
Yossarian42

26

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

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

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


8
在关闭之前调用flush是多余的,对吗?它与简单地调用close相同。
约翰·亨克尔

2
@BimanTripathy我可以100%保证地说。它是通过对Javadoc保证FilterOutputStreamFilterWriter
罗恩侯爵,2015年

7

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

在放在Java库中的BufferedWriter类中,有一行类似:

private static int defaultCharBufferSize = 8192;

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

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

网页:453


4

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


5
这是幻想。流不能被任何魔术线程访问;仅由应用程序创建的那些。
罗恩侯爵,

3

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


这不是真的。FileOutputStream.flush()是空的无操作。
vertuso
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.