簡體   English   中英

如何在管道輸入時讓java退出

[英]How do I get java to exit when piped to head

我有一個java進程打印出很多文本。 有時我只是想看一些文字。 使用普通程序,我可以這樣做:

$ myprog | head

我只會看到myprog的10行輸出,它會立即退出。 但是對於java,如果我這樣做:

$ java MyClass | head

我獲得了前10行輸出,但java進程在完成所有處理之前不會退出。 這就像java並不關心stdout(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:

$ 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

當我將輸出管道輸出到像head這樣的東西時,如何在調用System.out.println()時讓java引發異常? 我希望能夠做到這樣的事情:

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

我正在使用checkError()

來自PrintStream-API-Docu

與其他輸出流不同,PrintStream永遠不會拋出IOException; 相反,異常情況只是設置一個內部標志,可以通過checkError方法進行測試。

所以嘗試這樣的事情:

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

如果您不喜歡Sascha的答案中.checkError()方法,而寧願接收可以使用的異常

OutputStream stream = new FileOutputStream(FileDescriptor.out);

您將丟失PrintStream特定的功能。 就我而言,它們並不相關,這種方法比構建一堆hacky檢查更容易。

請注意,如果您通過System.setOut重定向System.out ,則不會出現這種情況,因為FileDescriptor.out將指向原始輸出描述符,而不是重定向的描述符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM