2012-07-27 13 views
17

Tengo un proceso de Java que imprime una gran cantidad de texto. A veces solo quiero ver un poco del texto. Con los programas normales que sólo puede hacer:¿Cómo puedo obtener Java para salir cuando se conecta a la cabeza

$ myprog | head 

Voy a ver 10 líneas de salida de miprog y que va a salir de inmediato. Pero con java, si lo hago:

$ java MyClass | head 

puedo obtener las primeras 10 líneas de salida, pero el proceso java no saldrá hasta que se hace con toda su procesamiento. Es como si a java no le importara que stdout (System.out) se hubiera ido y el proceso de la cabeza haya desaparecido.

Todos los demás programas, ya sea la salida en silencio, como gato:

$ 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 salida con un roto tubería de error/excepción, 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 se puede conseguir java para elevar una excepción cuando llamando a System.out.println() cuando canalizo la salida a algo como head? Me encantaría ser capaz de hacer algo como:

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

SIGPIPE se envía al proceso de Java en este caso, pero no estoy seguro de lo que Java hace con él. Si pudieras verificar si la JVM recibió un sello y morir, debería funcionar. –

+0

Java hace cosas especiales con señales y sé por otros problemas que es casi imposible configurar un programa Java para atrapar señales. – onlynone

Respuesta

1

Si no les gusta el método de .checkError()Sascha's answer y prefieren recibir excepciones puede utilizar

OutputStream stream = new FileOutputStream(FileDescriptor.out); 

Se pierde la PrintStream específica funciones. En mi caso, no eran relevantes y este enfoque fue más fácil que construir un montón de cheques hacky.

Tenga en cuenta que esto no se comportará si ha redireccionado el System.out través System.setOut, como FileDescriptor.out apuntará al descriptor de salida original, no su redirigida uno.

11

estoy usando checkError()

De PrintStream-API-Docu:

A diferencia de otras corrientes de salida, un PrintStream nunca se lanza una IOException ; en cambio, las situaciones excepcionales simplemente configuran un indicador interno que se puede probar mediante el método checkError.

a fin de tratar algo como esto:

 while(!System.out.checkError()) { 
      System.out.println("hi"); 
     } 
+0

Gracias por la información de los documentos. Había estado buscando por todas partes algo así, pero por alguna razón pasó por alto la descripción del nivel superior. Eso es muy molesto, y parece que sería ineficaz llamar a checkError cada vez en lugar de simplemente try-catch. – onlynone

Cuestiones relacionadas