У меня есть java-процесс, который печатает много текста. Иногда я просто хочу увидеть немного текста. С нормальными программами я могу просто сделать:
$ myprog | head
Я просто увижу 10 строк вывода из myprog, и он немедленно выйдет. Но с 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
Как получить java, чтобы вызвать исключение при вызове System.out.println(), когда я выводю вывод на что-то вроде главы? Мне бы хотелось сделать что-то вроде:
try {
while(true) {
System.out.println("hi");
}
} catch(BrokenPipeException e) {
// exit gracefully
}