2010-10-14 10 views
25

Sto cercando di ottenere OutputStream del Process avviato da exec() nella console. Come si può fare?Printing Runtime exec() OutputStream alla console

Ecco il codice incompleto:

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.PrintStream; 
import java.io.Reader; 

public class RuntimeTests 
{ 
    public static void main(String[] args) 
    { 
     File path = new File("C:\\Dir\\Dir2"); 
     String command = "cmd /c dir"; 
     Reader rdr = null; 
     PrintStream prtStrm = System.out; 
     try 
     { 
      Runtime terminal = Runtime.getRuntime(); 

      OutputStream rtm = terminal.exec(command, null, path).getOutputStream(); 
      prtStrm = new PrintStream(rtm); 
      prtStrm.println(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

risposta

2

È necessario avviare un nuovo thread che avrebbe letto flusso di output terminale e copiarlo nella console, dopo aver chiamato Process.waitFor()

+3

Per tutti coloro che arrivano a questa domanda al giorno d'oggi: scorrere verso il basso, c'è una risposta migliore di sotto – forresthopkinsa

32

I credo che questo è quello che stai cercando:

String line; 
    Process p = Runtime.getRuntime().exec(...); 
    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    while ((line = input.readLine()) != null) { 
    System.out.println(line); 
    } 
    input.close(); 
+1

ho una domanda per la tua soluzione: non è necessario utilizzare process.waitFor()? Funziona anche senza ma perché? InputStreamReader attende fino al termine del flusso? –

+2

Sì, API: _Se nessun byte è disponibile perché è stata raggiunta la fine del flusso, viene restituito il valore -1. Questo metodo blocca fino a quando i dati di input non sono disponibili, viene rilevata la fine del flusso o viene generata un'eccezione. _ –

+0

aggiungere un 'redirectErrorStream (true)' per completezza. –

74

recente ho incontrato questo problema e volevo solo dire che dal momento che Java 7 il process builder api è stata ampliata. Questo problema può essere risolto con:

ProcessBuilder pb = new ProcessBuilder("yourcommand"); 
pb.redirectOutput(Redirect.INHERIT); 
pb.redirectError(Redirect.INHERIT); 
Process p = pb.start(); 

Spero che questo aiuta :)

+2

Risposta perfetta ed elegante. Se puoi usare Java 7, questa è assolutamente la strada da percorrere. – Shane

+0

Questa è la migliore risposta, anche se ce ne sono di buoni sopra, cerca sempre di usare gli strumenti che vengono nella toolbox Java per impostazione predefinita. Java 7/8 è un linguaggio estremamente capace e potente, con un toolkit in continua espansione ma efficace. – DtechNet

11

ho affrontato il problema simile e sto utilizzando il seguente codice.

Process p = Runtime.getRuntime().exec("....."); 
p.waitFor(); 

String line; 

BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
while((line = error.readLine()) != null){ 
    System.out.println(line); 
} 
error.close(); 

BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
while((line=input.readLine()) != null){ 
    System.out.println(line); 
} 

input.close(); 

OutputStream outputStream = p.getOutputStream(); 
PrintStream printStream = new PrintStream(outputStream); 
printStream.println(); 
printStream.flush(); 
printStream.close(); 
2

Prova VerboseProcess da jcabi-log:

String output = new VerboseProcess(new ProcessBuilder("foo.bat")).stdout(); 

La classe inizia un thread in background, ascolta il flusso di output, e lo registra.

0

Se è possibile utilizzare org.apache.commons.io.IOUTils da commons-io,

System.out.println(IOUtils.toString(process.getInputStream())); 
System.err.println(IOUtils.toString(process.getErrorStream()));