2013-04-21 21 views
16

Vorrei reindirizzare un output di processo java verso lo standard output del processo java padre.ProcessBuilder reindirizzato all'output standard

Uso della classe ProcessBuilder come segue:

public static void main(String[] args) { 
    ProcessBuilder processBuilder = new ProcessBuilder("cmd"); 
    processBuilder.directory(new File("C:")); 
    processBuilder.redirectErrorStream(true); // redirect error stream to output stream 
    processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); 
} 

mi sarei aspettato che le uscite del "cmd", che sono come:

Microsoft Windows [versione 6.1.7601] copyright (c) 2009 Microsoft Corporation. Tous droits réservés.

vengono visualizzati nella console DOS utilizzata per eseguire il programma java. Ma nulla viene visualizzato affatto nella console DOS.

Negli altri thread di discussioni, ho visto le soluzioni utilizzando una classe BufferedReader: ma qui vorrei che gli output del processo venissero visualizzati direttamente nello standard output, senza utilizzare alcun BufferedReader o "while reading loop". È possibile?

Grazie.

+3

Guarda le API per la classe System per i metodi di cui avrete bisogno: 'setout (...)', 'Setin (...)', 'setErr (...) '. –

+0

Questo dovrebbe funzionare. Non vedo perché non lo farebbe. – Qix

risposta

11

Ti sei perso un pezzo chiave, devi effettivamente iniziare il tuo processo e attendere il risultato. Credo che questo funzionerà,

processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); 
// Start the process. 
try { 
    Process p = processBuilder.start(); 
    // wait for termination. 
    p.waitFor(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+2

deve essere accettato answer @Elliott Frisch – gumuruh

12

Prova ProcessBuilder.inheritIO() di utilizzare lo stesso I/O come il processo di Java corrente. Inoltre è possibile daisy chain i metodi:

ProcessBuilder pb = new ProcessBuilder("cmd") 
    .inheritIO() 
    .directory(new File("C:")); 
pb.start(); 
+3

Solo una nota a piè di pagina per le mie informazioni personali - se si chiama 'pb.destroy()' troppo presto non si stampa nulla (anche se si chiama 'System.out.flush() '); –