通常,
System.out它是缓冲的输出流,因此在将文本刷新到目标位置之前会对其进行累积。由于可以最大程度地减少必须进行的昂贵系统调用的次数,因此可以大大提高打印大量文本的应用程序的性能。但是,这意味着文本并不总是立即显示,并且可能比书写的要晚得多。
System.err另一方面,通常不缓冲,因为需要立即打印错误消息。这比较慢,但是直觉是错误消息可能是时间紧迫的,因此可以证明程序变慢是合理的。根据Javadoc的规定
System.err:
通常,此流对应于主机环境或用户指定的显示输出或另一个输出目标。 按照约定, 即使主要输出流(变量out的值)已重定向到文件或其他目标位置
,该输出流也用于显示错误消息或其他信息,这些信息应引起用户的立即注意。 通常不会持续监控。
(我的重点)
但是,结果是,发送到的旧数据
System.out可能会在出现
System.err新消息之后显示,因为刷新旧缓冲的数据的时间比发送到的消息晚
System.err。例如,以下事件序列:
- “你好”被缓冲到
System.out
- “ PANIC”直接发送到
System.err
并立即打印。 - “世界!” 被缓冲到
System.out
,并打印出缓冲的数据
会导致输出
PANICHello, world!
即使
Hello被打印到
System.out之前
PANIC也被打印到
System.err。
希望这可以帮助!



