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

时间:2012-02-22 20:37:12

标签: java buffer system.out

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

第一个人是对的吗?如果stdout已满,System.out.print()是否可以开始阻止或删除数据?是否有导致此问题的代码示例?

1 个答案:

答案 0 :(得分:11)

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

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

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

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

有关详细信息,请参阅buffered streams tutorialjava.io.PrintStream class的文档。