因为flush()没有缓冲区,它对FileWriter没用吗?

在使用flush()的同时使用BufferedWriter方法时,这是有道理的,因为您可能希望立即清除流,以便该人员不必等到所有写入完成在文件更新之前。

但是当您使用FileWriter时,在write()参数中输入的内容直接写入文件,对吧?

在这种情况下,似乎没有缓冲区,因此刷新是无用的(对于FileWriter)。因此,FileWriter中是否存在我所忽略的小型缓冲区?

baichi999999999 回答:因为flush()没有缓冲区,它对FileWriter没用吗?

说明

  

但是当您使用FileWriter时,您将写入write()参数的内容直接写入文件中,对吧?

否,类FileWriter 使用了缓冲区。因此flush方法具有其有效的用例。

如果没有缓冲,则该方法将为无用,是的。但是它有缓冲。

因此,flush()必须用于触发实际数据向下游传递,以防数据仍在内部缓冲区中。就像您已经解释过的一样,例如BufferedWriter


文档和源代码

首先,documentation明确指出它使用了buffering-logic(更新了文档以突出显示此内容,而旧文档并未明确提及):

  

使用默认缓冲区大小将文本写入字符文件。

有关父类的更多详细信息:

  

生成的字节在写入底层输出流之前已在缓冲区中累积。

但是,好的,让我们也看看当前的实现(Java 13):

private static final int DEFAULT_BYTE_BUFFER_SIZE = 8192;
// ...
private ByteBuffer bb;
// ...
bb = ByteBuffer.allocate(DEFAULT_BYTE_BUFFER_SIZE);
// bb is used in the write and flush method ...

请注意,该实现是特定于平台的,并且在发行版,操作系统以及不同的JVM(StreamEncodersun-class)之间可能会有所不同。

,

java.io.FileWriter.flush()方法刷新流。如果流已保存来自各种write()方法的任何字符,请立即将它们写入其预期的目标。然后,如果该目标是另一个字符或字节流,则将其刷新。

  

例如,如果您拥有永久记录器,则可能要刷新   如此频繁地进行,这样,无论谁在阅读日志,都无需   等到缓冲区已满,才可以看到新的日志条目!

FileWriter实现了Flushable接口,而类FileWriterjava.io.OutputStreamWriter类的子类。 也许,如果没有缓冲区,它将不刷新任何内容。但是,不能保证,因为磁盘可能无法立即物理写入数据,因此仍然可能会丢失。但这不是Java程序的错。刷新将导致立即从缓冲区写入磁盘,因此,如果程序崩溃,数据也不会丢失。

  

假设虚拟文件中是否有任何修改的内容,并且   操作系统尚未将其自动更新为文件,如何   我们可以通知操作系统更新实际文件吗?这是   实际上是由flush方法处理的。

Java Code Examples for java.io.FileWriter.flush()

许多开发人员使用java.io.FileWriter.close()方法作为替代方法,该方法首先刷新流,然后关闭编写器。但是在关闭后,进一步的write()或flush()调用将引发IOException。

本文链接:https://www.f2er.com/2988068.html

大家都在问