我正在尝试将输出和错误消息打印到控制台。 但是有时输出顺序会改变,首先输出错误消息,然后输出简单消息,有人可以帮助我理解为什么会这样吗?输出的顺序在大多数时候都会改变。打印输出不一致。我正在使用Eclipse IDE,得到的输出如下。
我尝试打印以下代码,
System.out.println("simple message");
System.err.println("error message");
预期结果是这样
简单消息
错误消息
但实际结果是这样:
错误消息
简单消息
答案 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)
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");
}}
您可能会认为它是完美的,但仍然很少有机会摆脱比赛,这也是一个很小的机会。