Java的System.out.print()会永远缓冲到println()吗?

Chr*_*ess 6 java buffer system.out

我无意中听到了关于System.out.print()今天的争论.一个人声称,由于print()不包括终止\n,它写入的缓冲区最终会填满并开始丢失数据.另一个人声称他们一直在使用他们System.out.print()所有的Java程序,并且从未遇到过这个问题.

第一个人是对的吗?System.out.print()如果stdout已满,是否可以开始阻止或丢弃数据?是否有一个会导致这种情况的代码示例?

Gil*_*il' 12

System.out.print填充使用的缓冲区时,输出将写入文件(或连接到程序标准输出流的终端或其他数据目标),从而产生空缓冲区.在不关心缓冲区大小的情况下编写输出是正常用法.您永远不会崩溃或阻止您的程序或丢失数据不通过flush.

flush如果您需要立即在程序外部提供数据,则只需要明确调用.例如,如果您的程序与另一个程序来回交换数据,并且您正在向该程序发送请求并等待该程序的回复,则需要flush在发送请求后致电以确保其他程序收到该程序.同样,如果您的程序(或它运行的机器)崩溃,则只flush保证写出您上次调用时的输出.

如果将流设置为自动刷新,则写入换行符(显式或通过println)与调用一样好flush.调用close也调用flush(这就是为什么close可以抛出IOException:它可能必须写出数据而不能,例如因为流连接到整个磁盘上的文件).

请注意,如果System.out连接的流未立即准备好接收数据(例如,当数据通过管道传输到另一个不立即读取其输入的程序时),则刷新缓冲区可能会导致程序阻塞.由于缓冲区可以随时刷新(因为缓冲区恰好已满),因此对print非空参数的任何调用都可能会阻塞.

有关更多信息,请参阅缓冲流教程java.io.PrintStream的文档.