【问题标题】:Why is flushing not working on System.err?为什么刷新在 System.err 上不起作用?
【发布时间】:2016-04-14 17:05:57
【问题描述】:

我正在开发一个主类,它通过以下方式编写潜在的异常 e.printStackTrace() 并以

结尾
System.err.flush();
System.out.println("\n>>> EXITING...");

问题是当异常跟踪很大时,我的退出消息仍然打印在所有错误布道的中间。

我做错了什么?

【问题讨论】:

  • 请发MCVE
  • 是否涉及多个线程?
  • 我担心它不是确定性的,因为我的私有代码使用具有不同滞后的不同操作,并且缓冲区可能已满或未满,每个终端都有其性能。在我达到这种情况之前,这有点偶然,所以我认为不需要进行基准测试。应该是概念问题。来吧,它是单线程的,逻辑上可复制 3 行。
  • 在进一步研究之前,至少有人可以判断这是否是预期问题
  • errout 是两个独立的流。即使您刷新输出,也只是意味着所有字符都已发送到 o/s。读取这两个流的终端(?)在显示它们时可能仍会交织这两个流。

标签: java stream java-8 printstream


【解决方案1】:

System.errSystem.out 是两个独立的流。即使您刷新输出,也只是意味着所有字符都已发送到 o/s。读取这两个流的终端(?)在显示它们时可能仍会交织这两个流。

一种补救措施可能是将流捆绑在一起,有效地将System.err 流写入System.out,但您将失去在显示时区分两个流的任何颜色等。

【讨论】:

  • 我使用这个解决方案并添加了一个小忍者技巧来克服颜色丢失的问题。在出现错误消息的情况下,我在字符串中添加了字符 \uD83D\uDD25 以突出显示错误! :)。示例: System.out.println("\uD83D\uDD25\uD83D\uDD25\uD83D\uDD25 -> 我的错误!!!");
【解决方案2】:

遇到了同样的问题。我在刷新后添加了 Thread.sleep(5) 。然后就成功了。

【讨论】:

  • 尝试突出显示关键字并明确格式,这将有助于为其他人找到答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
相关资源
最近更新 更多