Java + Eclipse:同步stdout和stderr

Mar*_*aux 10 java eclipse synchronization stdio

我用Eclipse.当我有这样的应用程序时:

write 20 times 'Hello World\n' to stdout
write 'ERROR\n' to stderr
write 5 times 'Hello  World\n' to stdout
Run Code Online (Sandbox Code Playgroud)

输出看起来很多次像这样:

Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
...
Hello World
Hello World
Hello World
ERROR
Run Code Online (Sandbox Code Playgroud)

有没有办法同步这两个输出流?当然,在20次块之后Hello World等待几毫秒并且在打印之后等待几毫秒ERROR.

Vim*_*mes 7

信不信由你,冲洗不是解决方案....

如果流导致"底层操作系统提供的抽象"(例如磁盘驱动器或控制台),那么剩余的字节"将被传递给操作系统进行写入;它不能保证它们实际被写入......"(请参阅OutputStream文档).这里的关键是操作系统可以按照不同的顺序处理来自不同流的刷新.

我只是在我的程序中发生了这种情况.我在两条正常消息之间出现了一条错误消息,这两条消息都在错误消息之前刷新了.

所以问题仍然存在,是否存在同步两个流的内置方法?或者我们必须手动处理?


mdm*_*dma 6

对于"严肃"的使用,我不喜欢直接写System.out/System.err,因为它硬编码目的地,它也使用相当古怪PrintStream(是字节流还是字符流?).如果将输出流包装在自己的中PrintWriter,则可以将其设置为自动刷新 - 构造函数中的第二个参数是auto-flush.

例如

PrintWriter out = new PrintWriter(System.out, true);
PrintWriter err = new PrintWriter(System.err, true);

out.println("Hello world");
//this will flush after writing the end of line
Run Code Online (Sandbox Code Playgroud)

看到


aio*_*obe 3

System.out和System.err是普通PrintStream对象(它们提供了flush()方法),所以尝试System.out.flush()System.err.flush()