BJ *_*ruz 10 java stdout stderr
在Java中,我注意到有时,System.err语句在System.out语句之前首先打印,尽管后者在我的代码中首先出现在前者之前.为什么?我很好奇.
tem*_*def 17
通常,System.out是缓冲的输出流,因此在将文本刷新到目标位置之前会累积文本.这可以显着提高打印大量文本的应用程序的性能,因为它可以最大限度地减少必须进行的昂贵系统调用的次数.但是,这意味着文本并不总是立即显示,并且可能比它写入的时间晚得多.
System.err另一方面,通常不缓冲,因为错误消息需要立即打印.这是较慢的,但直觉是错误消息可能是时间关键的,因此程序减速可能是合理的.根据Javadoc的System.err说法:
通常,该流对应于主机环境或用户指定的显示输出或另一输出目的地.按照惯例,此输出流用于显示应立即引起用户注意的错误消息或其他信息,即使主要输出流(变量out的值)已重定向到文件或其他目标,即通常不会持续监控.
(我的重点)
但是,结果是,发送到的旧数据System.out可能会在较新的System.err消息之后显示,因为旧的缓冲数据的刷新时间晚于发送消息的时间System.err.例如,这一系列事件:
System.outSystem.err并立即打印.System.out,并打印缓冲的数据会导致输出
PANIC
Hello, world!
Run Code Online (Sandbox Code Playgroud)
即使Hello打印到System.out以前PANIC打印到System.err.
希望这可以帮助!