2012-07-27 52 views
17

我有一個java進程打印出大量的文本。有時我只想看一些文字。通過正常的程序,我可以這樣做:我該如何讓java退出時管道

$ myprog | head 

我只看到10行輸出myprog,它會立即退出。但是用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 

如何獲取Java引發異常時調用System.out.println()當我管輸出到頭像?我很想能夠做到像:

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

在這種情況下,SIGPIPE被髮送到java進程,但我不確定java用它做什麼。如果你可以檢查JVM是否收到sigpipe並死掉,它應該可以工作。 – 2012-07-27 21:15:27

+0

Java使用信號做特殊的事情,我從其他問題知道,幾乎不可能將java程序設置爲陷阱信號。 – onlynone 2013-01-11 17:51:55

回答

1

如果你不喜歡從Sascha's answer.checkError()方法,而寧願接受例外,您可以使用

OutputStream stream = new FileOutputStream(FileDescriptor.out); 

您失去PrintStream具體功能。在我的情況下,它們並不相關,這種方法比構建一堆hacky支票更容易。

請注意,這不會做人,如果你已經通過重定向的System.setOutSystem.out,爲FileDescriptor.out將指向原來的輸出描述,不是你的重定向一個。

11

我使用checkError()

PrintStream-API-Docu

不像其他的輸出流,一個PrintStream不會拋出一個IOException異常 ;相反,例外情況僅僅設置了一個可以通過checkError方法測試的內部 標誌。

所以嘗試財產以後這樣的:

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

感謝您對文檔的支持。我一直在尋找類似的東西,但由於某種原因,在最高級別的描述上閃爍。這太令人討厭了,看起來每次調用checkError都會是低效的,而不僅僅是一次嘗試。 – onlynone 2012-07-27 22:04:50

相關問題