Как я могу выйти из java, когда нажимают на него?
У меня есть 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
}
Ответы
Ответ 1
Если вам не нравится метод .checkError()
из ответа Sascha и скорее получите исключения, вы можете использовать
OutputStream stream = new FileOutputStream(FileDescriptor.out);
Вы теряете определенные функции PrintStream
. В моем случае они не были релевантными, и этот подход был проще, чем создание кучи хакерских проверок.
Обратите внимание, что это не будет вестись, если вы перенаправили System.out
через System.setOut
, так как FileDescriptor.out
будет указывать на исходный дескриптор вывода, а не на ваш перенаправленный.
Ответ 2
Я использую checkError()
От PrintStream-API-Docu:
В отличие от других выходных потоков, PrintStream никогда не выбрасывает IOException; вместо этого исключительные ситуации просто устанавливают внутренний флаг, который может быть протестирован с помощью метода checkError.
попробуйте что-нибудь вроде этого:
while(!System.out.checkError()) {
System.out.println("hi");
}