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
.
如果流导致"底层操作系统提供的抽象"(例如磁盘驱动器或控制台),那么剩余的字节"将被传递给操作系统进行写入;它不能保证它们实际被写入......"(请参阅OutputStream文档).这里的关键是操作系统可以按照不同的顺序处理来自不同流的刷新.
我只是在我的程序中发生了这种情况.我在两条正常消息之间出现了一条错误消息,这两条消息都在错误消息之前刷新了.
所以问题仍然存在,是否存在同步两个流的内置方法?或者我们必须手动处理?
对于"严肃"的使用,我不喜欢直接写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)
看到
System.out和System.err是普通PrintStream
对象(它们提供了flush()方法),所以尝试System.out.flush()
和System.err.flush()
。
归档时间: |
|
查看次数: |
3024 次 |
最近记录: |