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):
- FileWriter.java
- 延长 OutputStreamWriter.java
- 它使用具有缓冲区的 StreamEncoder.java:
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 之间可能有所不同(StreamEncoder
是 sun-class)。
当您在使用 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):
- FileWriter.java
- 延长 OutputStreamWriter.java
- 它使用具有缓冲区的 StreamEncoder.java:
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 之间可能有所不同(StreamEncoder
是 sun-class)。