Java 为什么有时会先打印System.err语句?
在Java中,我注意到有时,Java 为什么有时会先打印System.err语句?,java,stdout,stderr,Java,Stdout,Stderr,在Java中,我注意到有时,System.err语句在System.out语句之前先打印出来,尽管在我的代码中后者出现在前者之前。为什么?我很好奇。通常,System.out是一个缓冲输出流,因此文本在刷新到目标位置之前会被累积。这可以显著提高打印大量文本的应用程序的性能,因为它可以最大限度地减少必须进行的昂贵系统调用的数量。然而,这意味着文本并不总是立即显示,并且可能会比书写的时间晚很多 另一方面,System.err通常不被缓冲,因为需要立即打印错误消息。这是缓慢的,但直觉是错误消息可能是时
System.err
语句在System.out
语句之前先打印出来,尽管在我的代码中后者出现在前者之前。为什么?我很好奇。通常,System.out
是一个缓冲输出流,因此文本在刷新到目标位置之前会被累积。这可以显著提高打印大量文本的应用程序的性能,因为它可以最大限度地减少必须进行的昂贵系统调用的数量。然而,这意味着文本并不总是立即显示,并且可能会比书写的时间晚很多
另一方面,System.err
通常不被缓冲,因为需要立即打印错误消息。这是缓慢的,但直觉是错误消息可能是时间关键的,因此程序减速可能是合理的。根据:
通常,此流对应于主机环境或用户指定的显示输出或另一个输出目标按照惯例,此输出流用于显示错误消息或用户应立即注意到的其他信息,即使主输出流(变量out的值)已重定向到通常不受连续监控的文件或其他目标
(我的重点)
但是,因此,发送到System.out
的旧数据可能会在较新的System.err
消息之后显示,因为旧缓冲数据的刷新时间晚于发送到System.err的消息。例如,此事件序列:
- “Hello”缓冲到
系统。out
- “紧急”直接发送到
系统。err
并立即打印
- “world!”缓冲到
System.out
,并打印缓冲数据
将导致输出
PANIC
Hello, world!
即使在PANIC
被打印到System.err
之前,Hello
被打印到System.out
希望这有帮助 它与缓冲和优先级有关。据推测,Java(如C和C衍生工具)不缓冲System.err
、stderr
等,这与System.out
、stdout
等不同。这样,系统可以确保您最有可能得到任何相关的错误消息,即使出于某种原因不得不放弃标准输出
发件人:
将标准输出和标准错误定向到同一目的地(如文本终端)是可以接受的,也是正常的。除非涉及缓冲,否则消息的显示顺序与程序写入消息的顺序相同。(例如,一种常见情况是,标准错误流未缓冲,但标准输出流是行缓冲的;在这种情况下,如果标准输出流的缓冲区尚未满,则稍后写入标准错误的文本可能会更早出现在终端上。)
我从来没有考虑过溪流的优先次序。。那是怎么回事?我同意简单的缓冲解释。只是一个华丽的语言问题。修正为更技术性的:)只是出于好奇:当通过管道传输到终端时,java是否能提供与C wrt标准输出相同的保证?也就是说,每次写换行符时,我们都会刷新缓冲区?@Voo-我只是查看了Javadoc,似乎没有类似的内容。PrintStream
被实现为在几乎完成所有操作后进行刷新(我认为您可以直接写入
,但实际上没有).从1.02开始,我一直坚持使用System.err
,当我正是出于这个原因进行黑客攻击时。我不知道Java的最新版本是如何运行的,因为我没有对它进行测试。