gpt4 book ai didi

java - 如何检查 PrintStream 是否打开而不进行打印

转载 作者:行者123 更新时间:2023-12-01 20:00:19 25 4
gpt4 key购买 nike

我有一个用 Java 编写的 GUI 程序,它使用 System.out.println 将数据输出到命令行。数据旨在通过管道输送到另一个程序中。作为示例,我将通过 head 传输程序:

$ java MyProgram | head -n10

我希望我的程序在管道损坏时退出:在本例中,这应该在 MyProgram 打印出十行文本之后发生。

a similar question on this site ,并且那里给出的解决方案效果相当好;例如,我可以在自己的线程中运行以下代码:

while(!System.out.checkError()) {
// sleep 100ms
}
System.exit(0);

问题是 PrintStream.checkError() 似乎仅在您尝试打印到流并失败后才返回 true 。因此,我的程序实际上不会退出,直到打印出11行文本:管道在前十行之后就被破坏了,但是System.out继续返回 true 直到我尝试通过管道传输第十一行。

打印出额外的“垃圾”行以触发 PrintStream 上的错误是不可能的,因为管道右侧的程序可能对数据非常敏感它收到了。

在循环内调用 System.out.flush()PrintStream.checkError() 没有影响,即使 PrintStream 的源代码code> 指示它应该调用该类中的私有(private) ensureOpen 方法。

如何可靠地测试 System.out 是否打开而不向其打印任何内容?

<小时/>

“现实世界”示例:假设我有一些程序consumer,它接受命令行输入并用它执行某些操作。某些输入片段将调用 consumer 以静默方式失败。由于consumer的输入有时又长又深奥,我用Java编写了一个GUI程序InputProvider,我可以在其中单击按钮并将相应的命令打印到stdout 。如果我将 InputProvider 的输出通过管道传输到 consumer 中,那么我就能够以图形方式控制 consumer

不幸的是,当 consumer 关闭时,InputProvider 似乎无法通知用户,除非尝试写入 consumer > 并获得某种异常。

最佳答案

我认为你无法在 Java 中解决这个问题。 System.out 没有任何问题,直到您写入它并失败为止。另一个进程 (head) 结束了,但 Java 进程无法知道这一点。

所以我认为你有两个选择。

  1. 不要使用管道连接 head,而是限制 Java 代码中的输出 - 然后您就会知道何时停止
  2. 接受最后一行将失败并适当处理异常

关于java - 如何检查 PrintStream 是否打开而不进行打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48119790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com