将输出和错误消息打印到控制台

时间:2019-01-08 05:56:15

标签: java eclipse

我正在尝试将输出和错误消息打印到控制台。 但是有时输出顺序会改变,首先输出错误消息,然后输出简单消息,有人可以帮助我理解为什么会这样吗?输出的顺序在大多数时候都会改变。打印输出不一致。我正在使用Eclipse IDE,得到的输出如下。

我尝试打印以下代码,

System.out.println("simple message");  
System.err.println("error message");  

预期结果是这样

  

简单消息

     

错误消息

但实际结果是这样:

  

错误消息

     

简单消息

7 个答案:

答案 0 :(得分:3)

System.out.println()和System.err.println()是不同的执行流。输出流被缓存,因此所有写入都进入该内存缓冲区。经过一段时间的安静后,它们实际上被写了出来。这是一个for循环,本质上再次显示了您的错误:

for(int x = 0; x <= 5; x++) {
    System.out.println("Out");
    System.err.println("Err");



}

为了在每次循环中“刷新” Streams调用.flush():

for(int x = 0; x <= 5; x++) {
    System.out.println("Out");
    System.out.flush();
    System.err.println("Err");
    System.err.flush();


}

在此for循环中,将首先打印out消息和err消息,但是在每次刷新时,将先打印out消息,然后再打印err消息。输出将如下所示:

OutErr
Out
Out
Out
Out
Out

Err
Err
Err
Err
Err

这是因为System.out和System.err在不同的Stream上执行。

答案 1 :(得分:1)

即使您在写入后刷新流,这些流也会被Eclipse中的不同线程读取,并且如果写入几乎是同时进行的,则即使对stdout的相应写入,也会发生在读取stderr的线程之前执行了读取stderr的线程。 stdout首先发生。

自Java 1.5起就有ProcessBuilder类,可以在Eclipse中通过在启动过程中将stderr重定向到stdout来解决它-但是Eclipse的以不同颜色显示stderr输出的功能会因此而被破坏。

您可以将您的意见添加到https://bugs.eclipse.org/bugs/show_bug.cgi?id=32205

答案 2 :(得分:0)

由于它们是两个不同的执行流,因此它们独立执行。而且它们不在不同的块范围内,因此未调用close()导致也不会调用flush()。然后它们处于同一级别。因此,JVM在这里发挥了领导作用,并按照他想要的方式执行了这两个流。

因此,有意在每个流的末尾调用flush()将帮助您回到代码的驾驶席位

答案 3 :(得分:0)

试试这个..

System.out.println("Out");

 System.out.flush();

 System.err.flush();

 System.err.println(" err ");

答案 4 :(得分:0)

如上一个answers中的建议,您可以使用System.setErr

为输出和错误流设置相同的流。
System.setErr(System.out);
  

重新分配“标准”错误输出流。

但是不建议在生产环境中的实际应用中使用此设置

答案 5 :(得分:0)

  • 请记住,这不仅取决于用户定义的序列,还取决于接收的应用程序。
  • 例如,如果Eclipse IDE有两个线程,一个用于接收错误流,一个用于接收system.out流,那么这些线程不在您的控制范围内,因此您可能会看到序列不时地发生变化。
  • 如果您不关心性能,则可以在两者之间稍作休息。

System.out.println("Out");

Thread.sleep(50);

System.err.println("error");

答案 6 :(得分:0)

就像Simeon Ikudabo所说的那样,任务是不可能的!但对于最接近的人,请尝试

static void print(PrintStream p, Object o) throws InterruptedException {
    Object lock = new Object();
    synchronized (lock) {

        Runnable r = new Runnable() {
            public void run() {
                synchronized (lock)
                {
                p.println(o);
                lock.notify();
                }
            }
        };
        new Thread(r).start();

        lock.wait();
    }

}

public static void main(String[] args) throws InterruptedException {

    for (int i = 0; i < 50; i++) {
        print(System.out, "out");
        print(System.err, "err");

    }}

您可能会认为它是完美的,但仍然很少有机会摆脱比赛,这也是一个很小的机会。