BufferedWriter自动冲洗

时间:2013-07-29 14:02:56

标签: java flush filewriter bufferedwriter

我想知道我应该写多长时间才能超过缓冲区,从而自动刷新缓冲区。

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:只是了解缓冲区在幕后的工作原理。

提前致谢。

3 个答案:

答案 0 :(得分:1)

根据Writer合同。你应该在完成Writer之后调用close(),这样它就可以完成写入数据并关闭它的资源(在本例中是file的文件处理程序)。

除此之外,缓冲区大小等实现细节不应该与您有关,因为它们可以在将来的Java版本中更改,或者如果您更改了所使用的Writer实现。

此外,Buffered Writer的重点是通过将大块数据收集到缓冲区然后立即写入整个缓冲区来减少数据实际写入磁盘的次数。创建缓冲区为1的BufferedWriter会失败。

答案 1 :(得分:1)

如果查看任何BufferedWriter的{​​{1}}方法的Java源代码,您会看到write方法调用,而这些调用又会调用flushBuffer 。它不会调用out.write(...)

这意味着更容易理解的术语:

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

答案 2 :(得分:0)

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

private char cb[];

默认大小= 8192.在写下一个char之前,它检查缓冲区是否已满,如果为true,则将其刷新。

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

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