Visto che ultimamente ho scritto un post con tante chiacchiere e 2 righe di codice che servivano ad eseguire il redirect dello standard output e lo standard error su altri stream, ora voglio scrivere un post che parla di una cosa molto simile: eseguire il redirect di standard output e standard error, ma di processi esterni.
Ovviamente la cosa si può fare solo su processi di cui si ha il controllo via codice. per esempio dopo averli eseguiti con il metodo exec() di java.io.Runtime.
Siccome il processo lanciato è indipendente da quello che l'ha generato allora l'I/O e l'error saranno su stream separati. In poche parole sul video non viene visualizzato nulla di quello che il nuovo processo stampa.
Quindi per poter ottenere comunque i dati che vengono stampati bisogna catturare lo stream di tale processo e successivamente stamparlo su qualche altro stream, magari lo standard I/O ed error del processo padre.
Il codice per fare tutto ciò è il seguente:
try { Process p = Runtime.getRuntime().exec("comando"); String line; BufferedReader in = new BufferedReader( new InputStreamReader(p.getInputStream()) ); while ((line = in.readLine()) != null) System.out.println(line); in.close(); in = new BufferedReader( new InputStreamReader(p.getErrorStream()) ); while ((line = in.readLine()) != null) System.err.println(line); in.close(); } catch(IOException | InterruptedException e) { e.printStackTrace(); }
E questo è quanto.
Ovviamente questo funziona con Java 7, altrimenti non si può fare la cosa figa del multi catch :)
Al prossimo post!
Nessun commento:
Posta un commento