Kotlin中调用print(String)为何等待换行才向控制台输出内容?
Kotlin print 无实时输出问题原因
- 代码层面的
System.out.flush()调用逻辑正确,问题源于运行环境的输出缓冲机制,和Kotlin语言本身无关。 - IntelliJ IDEA等集成开发环境的控制台默认启用行缓冲规则:仅当输出内容包含换行符
\n、缓冲区占满、程序进程结束时,才会将缓存的内容批量打印到控制台,此时手动调用的flush操作会被IDE的缓冲层拦截,无法生效。 - 原生终端环境下部分操作系统也默认开启行缓冲,无换行的短文本输出会被暂存到缓冲区,直到满足触发条件才会展示。
解决方法
IDE运行场景
打开对应运行配置的VM参数设置,添加参数-Dkotlin.io.stdout.flush.always=true,强制Kotlin标准输出每次写入后自动刷新缓冲。
如果仅需要临时验证效果,可在print语句后额外输出一个空字符触发缓冲刷新,示例代码如下:
fun main() { println("Start") var i = 1 while (i <= 10) { Thread.sleep(500) print("... ") print('\u0000') System.out.flush() i++ } }
终端运行场景
执行程序前先运行stty -icanon min 1 time 0关闭终端行缓冲模式,程序运行结束后执行stty icanon恢复默认配置即可。
内容的提问来源于stack exchange,提问作者Baterka
相关产品推荐
相关产品推荐

