Подтвердить что ты не робот

Как я могу выйти из 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
}
4b9b3361

Ответ 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");
        }