0

我想知道我应该写多长时间才能超过缓冲区并因此自动刷新缓冲区。

try
    {
        BufferedWriter br = new BufferedWriter(new FileWriter(file),1);

            br.write("How much should I write in order to get it flushed without using .flush() nor close());

我知道 close() 会自动刷新缓冲区,但我也知道,一旦缓冲区已满并且它接收到更多输入,它就会刷新它然后获得更多输入。所以我应该再写多少才能克服1我在构造函数中指定的大小?我已经输入了很多但是没有结果。PS:这只是为了了解缓冲区在幕后是如何工作的。

提前致谢。

4

3 回答 3

1

根据Writer合同。当您使用 Writer 完成后,您应该始终调用 close() 以便它可以完成写入数据并关闭其资源(在本例中为 File 处理程序file)。

除此之外,缓冲区大小等实现细节不应该让您担心,因为它们可能会在 Java 的未来版本中发生变化,或者如果您更改了您使用的 Writer 的实现。

此外,Buffered Writer 的全部意义在于通过将大块数据收集到缓冲区然后一次写入整个缓冲区来减少数据实际写入磁盘的次数。创建一个缓冲区为 1 的 BufferedWriter 违背了这个目的。

于 2013-07-29T14:17:10.997 回答
1

如果查看任何BufferedWriter'write方法的 Java 源代码,您将看到flushBuffer方法调用,然后调用out.write(...). 它不调用out.flush()

用更容易理解的术语来说,这意味着什么:

是的,它会在每个字符之后刷新,但它会将其刷新到底层WriterFileWriter在这种情况下),而不是实际文件(而不是flush,它调用flushBuffer以及out.flush(),将底层刷新Writer到实际文件)。FileWriter有自己的刷新发生时间的时间表(我不完全确定,但我认为缓冲区大小是 中定义的默认值StreamEncoder,即8192)。

于 2013-07-29T14:36:01.117 回答
0

正如我们从 BufferedWriter 源代码中看到的,它创建了一个字符缓冲区

private char cb[];

默认大小= 8192。在写入下一个字符之前,它会检查缓冲区是否已满,如果为真则刷新它。

...
if (nextChar >= nChars)
    flushBuffer();
cb[nextChar++] = (char) c;
...

也就是说,如果您使用默认缓冲区大小创建了 BufferWriter,则需要写入 8193 个字符以使其刷新

于 2013-07-29T14:13:45.970 回答