在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和B的打印。但是不是!它是10个A字符和10个B字符的随机出现。像这样:

enter image description here

为什么?以及它的解决方案是什么,以便As和B交替显示(A B A B A B ...)在我问这个问题之前,我检查了其他几个类似的问题的解决方案,并且没有为我的情况工作!我把其中一些带到了这里:


答案 1
Why does this happen?

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

Solution :(

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

建议的解决方案所做的是,它最终将只使用一个流来表示标准输出和标准误差,我认为这不是一件好事。


答案 2

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

System.setErr(System.out);

System.setOut(System.err);

推荐