Java:同步标准输出和标准错误

Iva*_*van 9 java eclipse

我有一个奇怪的问题,如果我能解决它会很好.出于调试目的(以及其他一些事情),我正在标准输出上编写控制台Java应用程序的日志.有些东西是标准出来的,有些东西就像错误一样打印在标准错误上.问题是这两者并不完全同步,因此打印线的顺序并不总是正确的.我想这是因为打印了许多东西,并且发生一个输出的缓冲区已满,所以另一个输出在第一个输出刷新缓冲区之前打印.

我想写这个:

syso: aaa
syso: bbb
syso: ccc
syso: ddd
syso: eee
syserr: ---
Run Code Online (Sandbox Code Playgroud)

有时打印的是

aaa
bbb
ccc
---
ddd
eee
Run Code Online (Sandbox Code Playgroud)

有时两者之间没有新线,所以它看起来像

aaa
bbb
ccc---

ddd
eee
Run Code Online (Sandbox Code Playgroud)

每次我在输出上打印一些东西时,我用相同的输出刷新

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

要么

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

如何解决这个问题呢?顺便说一句,一切都在Eclipse控制台中打印出来.

Ese*_*gün 9

问题是终端仿真器(在您的情况下,Eclipse)负责处理标准输出和应用程序的标准错误.如果不与终端仿真器通信,您将无法确定outerr以正确的顺序显示.因此,我会考虑打印所有内容err并将其重定向到文件.您仍然可以使用out干净的用户交互.

然而,对你的问题有一个(非常糟糕但严格的)解决方案:

System.out.println(...);
System.out.flush();
Thread.sleep(100);

System.err.println(...);
System.err.flush();
Thread.sleep(100);
Run Code Online (Sandbox Code Playgroud)

您可能需要根据配置更改睡眠持续时间!

  • @skia.heliou 因为延迟完全是任意的,并且可能会根据处理器的速度等而变化。 (2认同)

irr*_*ble -1

public class Util

    synchronized public static void printToOut(...)
        out.print(...)

    synchronized public static void printToErr(...)
        err.print(...)
Run Code Online (Sandbox Code Playgroud)

  • 这是可能的;即使我们在 JVM 中同步这两个流,它们仍然可以在终端设备上异步输出。 (4认同)