2012-07-27 10 views
17

Ho un processo java che stampa molto testo. A volte voglio solo vedere un po 'del testo. Con i programmi normali posso solo fare:Come faccio a ottenere java per uscire quando si esegue il pipe to head

$ myprog | head 

mi limiterò a vedere 10 linee di uscita da myprog e sarà uscire immediatamente. Ma con java, se faccio:

$ java MyClass | head 

ottengo le prime 10 linee di produzione, ma il processo di Java non uscirà fino a quando è fatto con tutta la sua elaborazione. È come se java non si preoccupasse del fatto che stdout (System.out) non c'è più e che il processo head head è morto e sparito.

Tutti gli altri programmi sia uscita in silenzio, come il gatto:

$ 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 uscire con un tubo rotto errore/eccezione, come il pitone:

$ 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 

Come si può ottenere java per sollevare un'eccezione quando chiamando System.out.println() quando eseguo il pipe di output su qualcosa come head? Mi piacerebbe essere in grado di fare qualcosa di simile:

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

SIGPIPE viene inviato al processo java in questo caso, ma non sono sicuro di cosa faccia java con esso. Se si potesse verificare se la JVM ha ricevuto un sigpipe e morire, dovrebbe funzionare. –

+0

Java fa cose speciali con i segnali e so da altri problemi che è quasi impossibile impostare un programma java fino a intercettare i segnali. – onlynone

risposta

1

Se non piace il metodo .checkError() da Sascha's answer e preferiscono ricevere eccezioni è possibile utilizzare

OutputStream stream = new FileOutputStream(FileDescriptor.out); 

Si perde la PrintStream specifica funzioni. Nel mio caso, non erano rilevanti e questo approccio era più semplice della creazione di una serie di controlli hacky.

Nota che questo non si comporterà se hai reindirizzato il System.out via System.setOut, come FileDescriptor.out punterà al descrittore di uscita originale, non il vostro reindirizzato uno.

11

sto usando checkError()

Da PrintStream-API-Docu:

A differenza di altri flussi in uscita, un PrintStream non genera IOException; invece, situazioni eccezionali si limitano a impostare un flag interno che può essere testato tramite il metodo checkError.

in modo da provare somthing come questo:

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

Grazie per l'avviso sui documenti. Avevo cercato dappertutto qualcosa del genere, ma per qualche ragione ho riflettuto sulla descrizione di livello superiore. Questo è super fastidioso, e sembra che sarebbe inefficiente chiamare checkError ogni volta piuttosto che solo un try-catch. – onlynone

Problemi correlati