Java 缓冲写入程序自动刷新

Java 缓冲写入程序自动刷新,java,flush,filewriter,bufferedwriter,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()会自动刷新缓冲区,但我也知道,一

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

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:这只是为了了解缓冲区在幕后是如何工作的


提前感谢。

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

private char cb[];
默认大小为8192。在写入下一个字符之前,它会检查缓冲区是否已满,如果为true,则会刷新缓冲区

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

也就是说,如果使用默认缓冲区大小创建了BufferWriter,则需要根据
Writer
契约写入8193个字符以使其刷新。当您完成写入程序时,应该始终调用close(),以便它可以完成数据写入并关闭其资源(在本例中是
文件的文件处理程序)

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


此外,缓冲写入器的全部目的是通过将大块数据收集到缓冲区,然后一次性写入整个缓冲区,从而减少数据实际写入磁盘的次数。创建一个缓冲区为1的BufferedWriter无法达到这个目的。

如果查看Java源代码中任何
BufferedWriter
write
方法,您将看到
flushBuffer
方法调用,而该方法调用
out.write(…)
。它不调用
out.flush()

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


是的,它将在每个字符后刷新,但会将其刷新到基础
写入程序
(在本例中为
文件写入程序
),而不是实际文件(与调用
刷新缓冲区
以及
out.flush()
,将基础
写入程序
刷新到实际文件相反)
FileWriter
有自己的刷新时间安排(我不完全确定,但我认为缓冲区大小是
StreamEncoder
中定义的默认值,即
8192
)。

为什么不查看BufferedWriter的源代码?哦,您正在传递1作为bufferesize@rocketboy我使用了构造函数,它允许我指定缓冲区大小。我还按照Kayman的建议检查了源代码,我看到它实际上在应该刷新的2个字符之后创建了一个大小为1 so 01的字符[],但没有发生。同样,我知道flush()方法和close()方法会刷新缓冲区。但是,我不想故意使用这些方法来检查缓冲区在幕后是如何工作的。通过使用size=1创建它。它没有反映预期的结果result@Kayaman我检查了一下,但是没有多大帮助。我在源代码中看到,它实际上在2个字符后创建了一个大小为1 so 01的字符[],应该刷新,但没有发生。
write(String)
不调用
write(int)
(这似乎是您复制代码的地方)…@Evgeniy dorofev所以为什么我不调用flush()或close()就无法在文件中打印任何内容呢。我将缓冲区大小设置为1,这样最多需要2个字符,然后刷新它。它不这样做。是的,它使用默认缓冲区大小(FileWriter)。。虽然write(String s)的源代码似乎将缓冲区大小设置为标准,即使是使用(Writer,int size)创建的。但从总体上看,这是有意义的,因为采用该大小的构造函数只是为了防止需要比标准缓冲区更大的缓冲区。。如果你需要小一点的(这没什么意义)。然而,有两个默认缓冲区,一个打包成另一个,所以在原始刷新之前,它将是16384个可用的总数。是吗?@Rolleball是的,我想是的。