今天在研究java中输入输出流问题时发现同时使用system.out和system.err会出现乱序问题,
给出代码:
System.out.println("tang");
System.err.println("crazy_Tang");
理想中的结果输出顺序应该是
tang
crazy_Tang
但实际会出现两种情况,如下
我们知道,system.out会存在一个输出缓冲区,但system.err不会,但这与上面的情况应该没有什么关系
看样子可能与线程有关,两种输出方式可能是线程不安全的
所以我尝试给这两行代码上锁,但是效果不佳
所以可能是线程冲突+缓冲区共同造成的,所以我改进代码
效果也不理想,所以我对缓冲区区别这种可能性死心了,至于线程冲突还是有可能
但是我加锁还是解决不了问题,所以先将这个问题放一边,我尝试将两种输出流重定向到文本文件
理想中,Console输出顺序是:
tang
crazy_Tang
文本文件中输出顺序是:
crazyTang
crazy!!
这时发现文本文件中输出顺序始终是正确的,但System.err打印不出红色
这给了我警示,可能是两种输出流线程冲突的原因,所以我再改进代码
这样顺序就一直正确了,但还是有问题:
System.err打印不出红色,这个原因我查了一下:
System.err.println只能在屏幕上实现打印,即使你重定向了也一样
(好像在JTextPane上也乐意实现打印)
总结:
system.out和system.err出现乱序问题是因为两种输出流产生线程冲突
解决策略是一种折中策略:
将err输出控制流重定向到System.out,但这样就没办法打出红字(将out输出流重定向到System.err也可)
System.setErr(System.out)