【问题标题】:What happens when an input Buffer in Java gets flushed automatically?当 Java 中的输入缓冲区自动刷新时会发生什么?
【发布时间】:2012-04-29 05:55:08
【问题描述】:

我刚读到

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

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

【问题讨论】:

  • 您将输出缓冲和刷新与输入缓冲混淆了。输入时没有冲洗。无法刷新 BufferedReader。你的问题毫无意义。

标签: java io stream


【解决方案1】:

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

我想你的意思是BufferedWriter。 (ReaderInputStream API 都没有 flush() 方法。刷新对“源”没有任何意义。)

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

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

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

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

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

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

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


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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-06
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      • 2019-08-02
      • 2017-05-19
      • 1970-01-01
      相关资源
      最近更新 更多