在使用flush()
的同时使用BufferedWriter
方法时,这是有道理的,因为您可能希望立即清除流,以便该人员不必等到所有写入完成在文件更新之前。
但是当您使用FileWriter
时,在write()
参数中输入的内容直接写入文件,对吧?
在这种情况下,似乎没有缓冲区,因此刷新是无用的(对于FileWriter
)。因此,FileWriter
中是否存在我所忽略的小型缓冲区?
在使用flush()
的同时使用BufferedWriter
方法时,这是有道理的,因为您可能希望立即清除流,以便该人员不必等到所有写入完成在文件更新之前。
但是当您使用FileWriter
时,在write()
参数中输入的内容直接写入文件,对吧?
在这种情况下,似乎没有缓冲区,因此刷新是无用的(对于FileWriter
)。因此,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(StreamEncoder
是sun-class)之间可能会有所不同。
java.io.FileWriter.flush()
方法刷新流。如果流已保存来自各种write()方法的任何字符,请立即将它们写入其预期的目标。然后,如果该目标是另一个字符或字节流,则将其刷新。
例如,如果您拥有永久记录器,则可能要刷新 如此频繁地进行,这样,无论谁在阅读日志,都无需 等到缓冲区已满,才可以看到新的日志条目!
类FileWriter
实现了Flushable
接口,而类FileWriter
是java.io.OutputStreamWriter
类的子类。 也许,如果没有缓冲区,它将不刷新任何内容。但是,不能保证,因为磁盘可能无法立即物理写入数据,因此仍然可能会丢失。但这不是Java程序的错。刷新将导致立即从缓冲区写入磁盘,因此,如果程序崩溃,数据也不会丢失。
假设虚拟文件中是否有任何修改的内容,并且 操作系统尚未将其自动更新为文件,如何 我们可以通知操作系统更新实际文件吗?这是 实际上是由flush方法处理的。
Java Code Examples for java.io.FileWriter.flush()
许多开发人员使用java.io.FileWriter.close()
方法作为替代方法,该方法首先刷新流,然后关闭编写器。但是在关闭后,进一步的write()或flush()调用将引发IOException。