sirve - sentencia para salir en java
¿Cómo consigo Java para salir cuando se canaliza a la cabeza (2)
Si no te gusta el método .checkError()
de la respuesta de Sascha y preferirías recibir excepciones, puedes usar
OutputStream stream = new FileOutputStream(FileDescriptor.out);
Se pierden las PrintStream
específicas de PrintStream
. En mi caso, no fueron relevantes y este enfoque fue más fácil que la construcción de un montón de controles piratas.
Tenga en cuenta que esto no se comportará si ha redirigido System.out
través de System.setOut
, ya que FileDescriptor.out
apuntará al descriptor de salida original, no a su redireccionado.
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
}
estoy usando checkError()
Desde PrintStream-API-Docu :
A diferencia de otras secuencias de salida, PrintStream nunca lanza una excepción IOException; en su lugar, las situaciones excepcionales simplemente establecen un indicador interno que se puede probar a través del método checkError.
así que intenta algo como esto:
while(!System.out.checkError()) {
System.out.println("hi");
}