gpt4 book ai didi

java - Java 的 System.out.print() 会一直缓冲到 println() 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:56:36 31 4
gpt4 key购买 nike

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

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

最佳答案

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

如果您需要立即使数据在您的程序之外可用,您只需要显式调用 flush。例如,如果您的程序正在与另一个程序来回交换数据,并且您正在向该程序发送请求并将等待该程序的回复,则您需要在发送请求后调用 flush以确保其他程序收到它。同样,如果您的程序(或运行它的机器)崩溃,则只有您最后一次调用 flush 时的输出才能保证被写出。

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

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

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

关于java - Java 的 System.out.print() 会一直缓冲到 println() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9402529/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com