¿Cómo consigo Java para salir cuando se canaliza a la cabeza

Tengo un proceso java que imprime mucho texto. A veces solo quiero ver un poco del texto. Con los programas normales solo puedo hacer:

$ myprog | head

Solo veré 10 líneas de salida de myprog y se cerrará inmediatamente. Pero con java, si lo hago:

$ java MyClass | head

Obtengo las primeras 10 líneas de salida, pero el proceso java no se cerrará hasta que haya terminado con todo su procesamiento. Es como a java no le importa que stdout (System.out) se haya ido y que el proceso principal haya muerto y se haya ido.

Todos los demás programas salen silenciosamente, como 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:

O salga con un error / excepción de tubería rota, como 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

¿Cómo puedo hacer que Java genere una excepción al llamar a System.out.println () cuando canalizo la salida a algo así como Head? Me encantaría poder hacer algo como:

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta