当Java中的输入缓冲区自动刷新时会发生什么?

时间:2012-04-29 05:55:08

标签: java io stream

我刚读过那个

  

一些缓冲的输出类支持autoflush,由a指定   可选的构造函数参数。启用autoflush时,某些键   事件导致缓冲区被刷新。例如,autoflush   PrintWriter对象在每次调用println时刷新缓冲区   或格式。

因此,如果我暂时保留任何BufferReader的引用并刷新它,那么所有数据将如何保留回来?是否有一些回调机制会自动刷新它并再次读取内容或者我会丢失数据并再次需要调用它?

2 个答案:

答案 0 :(得分:4)

  

因此,如果我暂时保留任何BufferReader的引用并刷新它,那么所有数据将如何保留回来?

我认为你的意思是BufferedWriter。 (ReaderInputStream API都没有flush()方法。法拉盛对“来源”没有任何意义。)

刷新的数据被写入流的“接收器”;即文件或套接字或其他。因此,如果您查看文件(或其他),如果已刷新(成功)流,则数据将在那里。

  

是否有一些回调机制会自动刷新它并再次阅读内容

没有回调机制 1 。 (至少,不在标准类库提供的任何缓冲流类中:谁知道自定义类可能做什么......)

当某些事情发生时,数据会自动刷新。例如,当应用程序为PrintWriter调用println时。

  

...或者我会丢失数据而我需要再打电话吗?

这在语法或语义上都没有意义。我不知道你想问什么。

也许你不明白冲洗的作用。刷新只是意味着将数据从缓冲区中推出,然后输出到流发送其数据的任何位置。明确的flush()调用或自动刷新只是意味着“立即编写”。


1 - 顺便提一下,BufferedWriter也没有finalize()方法。这意味着如果其中一个对象在仍然具有缓冲输出时变得无法访问,则永远不会写入该输出。

答案 1 :(得分:0)

我认为你在缓冲的读者作家之间感到困惑。你的陈述是关于缓冲的编写者,所以如果你写的是一个流,那么你真的不应该关心它是物理写入还是只写入缓冲区 - 它并不重要Java的。

我希望永远不会刷新缓冲的阅读器,但根据缓冲区的类型,它可能没问题。例如,如果从文件读取,则可以刷新缓冲区,并且当您尝试read()时,只需要从文件系统重新读取文件。但是,对于其他流内容,您不希望它被自动刷新,因为您将丢失缓冲区中的任何数据。