在java中复制System.out和System.err之间的竞争

请考虑这个java代码:

public class CMain { public static void main(String[] args){ for (int i = 0; i < 10; i++) { System.out.println("A"); System.err.println("B"); } } } 

通过快速查看代码,我们中的一些人可能认为输出必须是As和Bs的印刷品。 不过不是! 它是10个字符和10个B字符的随机外观。 像这样的东西:

在此处输入图像描述

这是为什么? 什么是它的解决方案,以便As和Bs交替显示(ABABAB …)在我问这个问题之前,我检查了其他几个类似的问题以寻求解决方案,而不是为我的案例工作! 我在这里带了一些:

  • 同步和System.out.println
  • Java:同步标准输出和标准错误
  • Java:System.out.println和System.err.println乱序 PS。 我使用Eclipse作为我的IDE

 Why does this happen? 

这是因为outerr是两个不同的输出流。 但是,它们都在控制台上打印。 因此,您不会将它们视为不同的流。 而且,当你执行out.println() ,不能保证一旦语句执行就会在控制台上看到输出。 相反,字符串通常(取决于系统)存储在输出缓冲区中(如果您愿意),稍后系统会将其从缓冲区输出到屏幕上。

 Solution :( 

虽然,正如Eng.Fouad所指出的那样,您可以使用setOut(System.err)setErr(System.out)来对它们进行排序,但是当您实际将它放入应用程序时,我仍然不建议这样做(仅使用它)用于调试目的)。

所提议的解决方案所做的是它最终将仅使用一个流用于标准输出和标准错误,我认为这不是一件好事。

它们是不同的OutputStream 。 如果您确实需要保证打印顺序,请使用:

 System.setErr(System.out); 

要么

 System.setOut(System.err); 

由于有两个独立的流,您可以提供输出。