我有一个java应用程序从stdin
获取数据并将结果写入stdout
。像这样:
app1 | java_app | app2
通过管道移动的数据量很大,需要很长时间(小时和天数并不罕见或意外)。
似乎如果app1
死亡,并关闭管道的末尾,我会收到与管道相关的异常。但是app2
死了,关闭管道的末端我没有收到异常。这意味着java_app
继续消耗输入,这将永远不会产生任何有用的输出,运行数小时或数天。
管道异常报告的差异似乎源于System.in
为InputStream
,而System.out
为PrintStream
且PrintStream
吞没了任何错误。我知道你可以使用PrintStream
从stream.checkError()
获取错误状态 - 但是在任何地方使用它都很笨重(强制刷新你的输出流。)
我很高兴放弃PrintStream
的大部分功能来获得更好的错误报告。
是否有其他方法可以访问未包含在PrintStream
中的stdout,而是更好的OutputStream
?
答案 0 :(得分:1)
原来我的一位同事找到了一个很好的方法来做到这一点。
OutputStream stream = new FileOutputStream(FileDescriptor.out);