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