我有一个java进程,可以输出很多文本。有时我只是想看一些文字。通过正常程序,我可以做到:
$ myprog | head
我只会看到myprog的10行输出,它会立即退出。但是对于java,如果我这样做:
$ java MyClass | head
我获得了前10行输出,但java进程在完成所有处理之前不会退出。这就像java并不关心stdout(System.out)已经消失,而且头部进程已经消失了。
所有其他程序要么以静默方式退出,例如cat:
$ 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
}
答案 0 :(得分:11)
我正在使用checkError()
与其他输出流不同,PrintStream永远不会抛出 IOException异常;相反,特殊情况只是设定内部 可以通过checkError方法测试的标志。
所以尝试这样的事情:
while(!System.out.checkError()) {
System.out.println("hi");
}
答案 1 :(得分:1)
如果您不喜欢Sascha's answer中的.checkError()
方法而宁愿接收例外,也可以使用
OutputStream stream = new FileOutputStream(FileDescriptor.out);
您失去了PrintStream
特定功能。就我而言,它们并不相关,而且这种方法比构建一堆hacky检查更容易。
请注意,如果您通过System.out
重定向System.setOut
,则不会出现这种情况,因为FileDescriptor.out
将指向原始输出描述符,而不是您重定向的描述符。