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

Is flush() useless for FileWriter since it has no buffer?

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

但是当你使用FileWriter的时候,你在write()的参数里面写的是直接写入文件,对吧?

在这种情况下,似乎没有缓冲区,因此刷新是无用的(在 FileWriter 的情况下)。那么在我忽略的 FileWriter 中是否有某种迷你缓冲区?

说明

But when you are using a FileWriter, what you put into the parameters of write() is written directly to the file, right?

不,class FileWriter 确实使用缓冲区。所以 flush 方法有其有效的用例。

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

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


文档和源代码

首先,documentation 明确指出它使用缓冲逻辑(更新文档以突出显示这一点,旧文档没有明确提及):

Writes text to character files using a default buffer size.

父级中有更多详细信息class:

The resulting bytes are accumulated in a buffer before being written to the underlying output stream.

不过好吧,让我们也看看当前的实现 (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 ...

请注意,实现是特定于平台的,并且在版本、OS 和特别是不同的 JVM 之间可能有所不同(StreamEncodersun-class)。