如何让Java错误行输出在预期位置,而非出现在终端输出的顶部或底部
问题原因
System.out与System.err是Java的两个独立输出流,默认均指向终端输出,但两者的缓冲区刷新规则存在差异:
System.out为行缓冲流,默认仅在遇到换行符、缓冲区满或者程序正常退出时才会将缓冲区内容刷入终端System.err默认是无缓冲设计,系统会优先将错误流的内容输出到终端,不需要等换行符或缓冲区填满
这种设计差异就会导致代码中交替输出System.out和System.err内容时,实际终端打印的顺序和代码编写的顺序不一致。
解决方案
- 每次输出后手动刷新缓冲区:在
System.out.println()调用后追加System.out.flush(),在System.err.println()调用后追加System.err.flush(),强制将当前流的缓冲区内容立即写入终端,再执行后续输出逻辑 - 统一输出流:如果不需要区分标准输出和错误输出,可直接将错误流重定向到标准输出,添加代码
System.setErr(System.out);,两个流共用同一套缓冲区后输出顺序就会完全符合代码逻辑 - IDE适配:如果是在IDE控制台遇到该问题,可在IDE的运行配置中开启「合并标准输出和错误输出」选项,关闭控制台对流输出的特殊优化
效果参考
预期输出效果:
实际输出效果:
内容的提问来源于stack exchange,提问作者Melza SacZ
相关产品推荐
相关产品推荐

