3

我刚读到

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

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

4

2 回答 2

4

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

我想你的意思是BufferedWriter。(这两个API 都没有Reader方法。刷新对“源”没有任何意义。) InputStreamflush()

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

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

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

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

...或者我会丢失数据并且我需要再次调用它?

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

也许你不明白冲洗的作用。刷新只是意味着将数据从缓冲区中推到流发送数据的任何地方。显式flush()调用或自动刷新只是意味着“现在就写”。


1 - 顺便说一句,BufferedWriter也没有finalize()方法。这意味着,如果这些对象之一在输出缓冲的情况下变得无法访问,则永远不会写入该输出。

于 2012-04-29T06:25:28.543 回答
0

我认为您在缓冲的readerwriters之间感到困惑。您的声明是在谈论缓冲的writers,因此如果您要写入流,那么您不应该真正关心它是物理写入还是仅写入缓冲区 - 这对 Java 无关紧要。

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

于 2012-04-29T06:26:46.733 回答