当前位置: 首页 > 面试题库 >

为什么有时会先打印System.err语句?

公良征
2023-03-14
问题内容

在Java中,我注意到有时在我的代码中,System.err语句先显示在System.out语句之前,尽管后者先出现在语句之前。为什么?我很好奇。


问题答案:

通常,System.out它是缓冲的输出流,因此在将文本刷新到目标位置之前会对其进行累积。由于可以最大程度地减少必须进行的昂贵系统调用的次数,因此可以大大提高打印大量文本的应用程序的性能。但是,这意味着文本并不总是立即显示,并且可能比书写的要晚得多。

System.err另一方面,通常不缓冲,因为需要立即打印错误消息。这比较慢,但是直觉是错误消息可能是时间紧迫的,因此可以证明程序变慢是合理的。根据Javadoc的规定System.err

通常,此流对应于主机环境或用户指定的显示输出或另一个输出目标。 按照约定, 即使主要输出流(变量out的值)已重定向到文件或其他目标位置
,该输出流也用于显示错误消息或其他信息,这些信息应引起用户的立即注意。 通常不会持续监控。

(我的重点)

但是,结果是,发送到的旧数据System.out可能会在出现System.err新消息之后显示,因为刷新旧缓冲的数据的时间比发送到的消息晚System.err。例如,以下事件序列:

  • “你好”被缓冲到 System.out
  • “ PANIC”直接发送到System.err并立即打印。
  • “世界!” 被缓冲到System.out,并打印出缓冲的数据

会导致输出

PANIC
Hello, world!

即使Hello被打印到System.out之前PANIC也被打印到System.err

希望这可以帮助!



 类似资料:
  • 当if语句为假时,为什么“无效运算符”会打印?我可以使用elif语句使其工作吗?

  • 问题内容: 上面的go代码仅打印一次map [string] string三次。 我希望它具有固定的输出,但它显示如下: 变了! 而在python中: 输出: 问题答案: 您不能依靠获得密钥的顺序。语言规范说: “一个映射是一组无序的元素”,后来又说: “未指定映射的迭代顺序,并且不能保证每次迭代之间都相同。”

  • 我下面的教程部分处理打印数组列表的元素。当处理小列表时,该程序完全按照我的预期运行。然而,当输入较大的数字时,字符串格式(我相信)会导致一些奇怪的结果。 我的代码如下: 使用主方法类: 输出(我只引用了足够多的内容)是: 我知道我用完了字母字符,这一行的格式: 仅用于处理“X###”格式的座位。 我想了解的是为什么会出现奇怪的字符(~"和'等)。)。显然,格式不合适。但是为什么它专门产生这个输出呢

  • 问题内容: 我有以下课程: 这是编译结果; 为什么我的输出中包含数字? 问题答案: 在第二种情况下,它将两个字符(G-71和o-111)的unicode码相加并打印总和。这是因为被视为数字类型,因此在这种情况下,运算符是通常的求和。

  • 问题内容: 我生成了x的两个矩阵: 第一矩阵:和。 第二矩阵:和。 使用以下代码,第一个矩阵花费了8.52秒完成: 使用此代码,第二个矩阵花费了259.152秒来完成: 运行时间显着不同的原因是什么? 正如评论所说,仅打印需要秒,而给。 正如其他指出它对他们正常工作的人一样,例如,我尝试了Ideone.com,这两段代码以相同的速度执行。 测试条件: 我从 Netbeans 7.2 运行了此测试,