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

时间:2013-02-28 22:58:10

标签: 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");
        }

    }
}

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

enter image description here

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

3 个答案:

答案 0 :(得分:10)

Why does this happen?

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

Solution :(

虽然 Eng.Fouad 指出您可以使用setOut(System.err)setErr(System.out)对其进行排序,但在实际投放时我仍然不建议这样做这在应用程序中(仅用于调试目的)。

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

答案 1 :(得分:5)

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

System.setErr(System.out);

System.setOut(System.err);

答案 2 :(得分:0)

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