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.out
和 System.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
在我的程序一开始,我打印出这两行:
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.out
和 System.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