我刚读到
一些缓冲输出类支持自动刷新,由可选的构造函数参数指定。启用自动刷新时,某些关键事件会导致刷新缓冲区。例如,自动刷新 PrintWriter 对象在每次调用 println 或 format 时刷新缓冲区。
因此,如果我暂时保留任何 BufferReader 的引用并且它被刷新,那么所有数据将如何保留回来?是否有一些回调机制会自动刷新它并再次读取内容,或者我会丢失数据并再次需要调用它?
因此,如果我暂时保留任何 BufferReader 的引用并且它被刷新,那么所有数据将如何保留回来?
我想你的意思是BufferedWriter
。(这两个API 都没有Reader
方法。刷新对“源”没有任何意义。) InputStream
flush()
刷新的数据被写入流的“接收器”;即文件或套接字或其他任何东西。因此,如果您查看文件(或其他文件),如果流已被刷新(成功),则数据将在那里。
是否有一些回调机制会自动刷新它并再次读取内容
没有回调机制1。(至少,在标准类库提供的任何缓冲流类中都没有:谁知道自定义类可能会做什么......)
当某些事情发生时,数据会自动刷新。例如,当应用程序println
为 PrintWriter 调用 ... 时。
...或者我会丢失数据并且我需要再次调用它?
这在语法上或语义上都没有意义。我不知道你想问什么。
也许你不明白冲洗的作用。刷新只是意味着将数据从缓冲区中推到流发送数据的任何地方。显式flush()
调用或自动刷新只是意味着“现在就写”。
1 - 顺便说一句,BufferedWriter
也没有finalize()
方法。这意味着,如果这些对象之一在输出缓冲的情况下变得无法访问,则永远不会写入该输出。
我认为您在缓冲的reader和writers之间感到困惑。您的声明是在谈论缓冲的writers,因此如果您要写入流,那么您不应该真正关心它是物理写入还是仅写入缓冲区 - 这对 Java 无关紧要。
我希望缓冲的阅读器永远不会被刷新,但根据缓冲区的类型,它可能没问题。例如,如果从文件中读取,缓冲区可能会被刷新,并且当您尝试read()
. 但是,对于其他流内容,您不希望它被自动刷新,因为您会丢失缓冲区中的任何数据。