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

C g*_*ics 17 java synchronization 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");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

Ank*_*kit 11

Why does this happen?
Run Code Online (Sandbox Code Playgroud)

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

Solution :(
Run Code Online (Sandbox Code Playgroud)

虽然,正如Eng.Fouad指出你可以使用setOut(System.err)setErr(System.out)使它们有序,但我仍然不建议你在实际将它放入应用程序时这样做(仅用于调试目的).

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


Eng*_*uad 5

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

System.setErr(System.out);
Run Code Online (Sandbox Code Playgroud)

要么

System.setOut(System.err);
Run Code Online (Sandbox Code Playgroud)

  • 这可能会起作用,但是你会忽略Eclipse应用的突出显示. (6认同)

Ahm*_*aya 0

由于有两个单独的流,因此您给出的输出是可能的。