System.out 和 .err - 回到未来?

System.out and .err - Back to the future?

在我的程序一开始,我打印出这两行:

Dyvil Compiler 1.0.0 for Dyvil 1.0.0

Loading Configuration File from 'config.txt'

第一个打印在 System.err,第二个打印在 System.out。两次 println 调用都发生在 main 方法中 ,并按上述顺序 。但是,似乎有时会交换消息:

Loading Configuration File from 'config.txt'

Dyvil Compiler 1.0.0 for Dyvil 1.0.0

当 运行 程序处于 Eclipse 调试模式或来自 Gradle 构建脚本时会发生这种情况(我没有使用 java 命令对其进行测试)。注意绝对不涉及多线程,所以不要告诉我精神错乱的定义。

这是怎么回事?

两个流就是这样,两个不同的流。因此,如果您最终将它们合并到某种控制台输出中,那么这些行出现乱序是完全可行的。

System.outSystem.err 都是 PrintStream,因此几乎肯定是缓冲的,所以这取决于它们何时被刷新。

您总是可以在第二个 println 之前但在第一个 println 之后添加 sleep(#ofseconds) 命令,以确保它被第二次打印。这将打印第一行,等待您选择的秒数,然后打印第二行。这是一种解决方法,但它可能会解决问题。

这是 Eclipse 中的一个错误 - "ordering of output sent to stdout and stderr is not deterministic"。参见 https://bugs.eclipse.org/bugs/show_bug.cgi?id=9720