java - 如何在管道传输到/从 javas stdin/stdout 时捕获错误

标签 java io try-catch

我有一个 Java 应用程序从 stdin 获取数据并将结果写入 stdout。像这样:

app1 | java_app | app2

通过管道移动的数据量很大并且需要很长时间(数小时和数天并不少见或意外)。

似乎如果 app1 死了,并关闭了它的管道末端,我会收到一个与管道相关的异常。但是 app2 死了,并关闭了它的管道末端我没有收到异常。这意味着 java_app 继续消耗输入,这将永远不会生成任何有用的输出,运行数小时或数天。

管道异常报告的差异似乎源于 System.in 是一个 InputStream,而 System.out 是一个 PrintStreamPrintStream 吞没任何错误。我知道您可以使用 stream.checkError()PrintStream 获取错误状态 - 但在任何地方使用它都很笨拙(并强制刷新输出流。) 我很高兴放弃 PrintStream 的大部分功能以获得更好的错误报告。

是否有另一种方法来访问未包装在 PrintStream 中的 stdout,而是更好的 OutputStream

最佳答案

原来我的一位同事找到了一个很好的方法来做到这一点。

OutputStream stream = new FileOutputStream(FileDescriptor.out);

关于java - 如何在管道传输到/从 javas stdin/stdout 时捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24237138/

相关文章:

java - 如果可以控制两端,Java 的开发版本和部署版本是否应该相同?

java - Apache Camel + RabbitMq - Camel 定义了自己的队列,并且不会从已定义的队列中读取

ruby - Popen 获取新运行进程的 pid

java - FileDescriptor.in 与 System.in

io - MPI - 抑制某些处理器的输出

JAVA - Try/Catch 遇到困难

java - 帮助基本的 Android View ,用于 Next/Prev 导航,如电子邮件设置

java - 何时使用 tryfinally 而不是 trycatchfinally

javascript - 我可以在 Node.js 的 javascript 中使用 catch(e if e instanceof SyntaxError) 吗?

java - 如何在没有 OutOfMemoryError 的情况下迭代大型 Mongo 集合