我如何获取Java退出时,通过管道输送到头部(How do I get java to exit w

2019-06-26 14:39发布

我有一个java程序将打印出大量的文字。 有时候,我只是想看看一点的文字。 随着正常程序中,我可以这样做:

$ myprog | head

我就看到MYPROG 10行输出,它会立即退出。 但是用java,如果我这样做:

$ java MyClass | head

我得到的第10行输出,但是java进程将不会退出,直到它与所有的处理完成。 这就像Java不关心标准输出(System.out的)消失,且头部的过程是死了。

所有其他程序或者退出默默地,像猫:

$ cat /etc/group | head
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:

或用水管坏的错误/异常,像蟒蛇退出:

$ python -c 'while True: print "hi"' | head
hi
hi
hi
hi
hi
hi
hi
hi
hi
hi
Traceback (most recent call last):
  File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe

调用的System.out.println时,如何能获取Java引发异常()时,我管输出到像头? 我很想能够做到这样的:

try {
    while(true) {
        System.out.println("hi");
    }
} catch(BrokenPipeException e) {
    // exit gracefully
}

Answer 1:

如果你不喜欢.checkError()从法萨沙的回答 ,而宁愿接受例外,您可以使用

OutputStream stream = new FileOutputStream(FileDescriptor.out);

你失去了PrintStream特定功能。 在我的情况,他们是不相关的这种做法是不是建立了一堆哈克检查更容易。

请注意,这不会表现如果你重定向System.out通过System.setOut ,如FileDescriptor.out将指向原来的输出描述,不是你的重定向一个。



Answer 2:

我使用checkError()

从PrintStream的-API的Docu :

不像其他的输出流,一个PrintStream从未抛出IOException; 相反,异常情况仅设置可通过checkError方法测试的内部标志。

所以尝试财产以后这样的:

        while(!System.out.checkError()) {
            System.out.println("hi");
        }


文章来源: How do I get java to exit when piped to head