Java的System.out.print()会永远缓冲到println()吗?
我今天无意中听到有关System.out.print()
的争论。 有人声称,由于print()
不包括终止\n
,它写入的缓冲区最终将填满并开始丢失数据。 另一个人声称他们一直在使用System.out.print()
来处理他们所有的Java程序,并且从未遇到过这个问题。
第一个人是对的吗? 如果stdout已满, System.out.print()
可以开始阻止或删除数据? 是否有导致此问题的代码示例?
当System.out.print
使用的缓冲区填满时,输出将写入文件(或连接到程序标准输出流的终端或其他数据目标),从而产生空缓冲区。 在不关心缓冲区大小的情况下编写输出是正常的用法。 您永远不会崩溃或阻止您的程序或丢失数据不会调用flush
。
如果需要立即在程序外部提供数据,则只需要显式调用flush
。 例如,如果您的程序与另一个程序来回交换数据,并且您正在向该程序发送请求并等待该程序的回复,则需要在发送请求后调用flush
以确保其他程序收到它。 同样,如果你的程序(或它运行的机器)崩溃,那么只保证写出最后一次调用flush
输出。
如果流设置为自动刷新,则写入换行符(显式或通过println
)与调用flush
一样好。 调用close
也调用flush
(这就是为什么close
可以抛出IOException
:它可能必须写出数据而不能,例如因为流连接到整个磁盘上的文件)。
请注意,如果System.out
所连接的流未立即准备好接收数据(例如,当数据通过管道传输到另一个不立即读取其输入的程序时),则刷新缓冲区可能会导致程序阻塞。 由于缓冲区可以随时刷新(因为缓冲区恰好已满),因此任何使用非空参数进行print
调用都可能会被阻塞。
有关更多信息,请参阅缓冲流教程和java.io.PrintStream
类的文档。