2010-10-14 7 views
25

Ich versuche, die OutputStream der Process initiiert von exec() an die Konsole zu bekommen. Wie kann das gemacht werden? HierDrucken Runtime exec() OutputStream zu Konsole

ist etwas unvollständig Code:

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(); 
     } 
    } 
} 

Antwort

2

Sie benötigen einen neuen Thread zu starten, die Terminal-Ausgabe-Stream lesen würde und kopieren Sie sie auf die Konsole, nachdem Sie rufen Process.waitFor()

+3

Für alle kommen auf diese Frage heute verwenden können: nach unten scrollen, gibt es eine bessere Antwort unten – forresthopkinsa

32

I glauben, das ist, was Sie suchen:

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

Ich habe eine Frage zu Ihre Lösung: Müssen Sie process.waitFor() nicht verwenden? Es funktioniert auch ohne, aber warum? Wartet der InputStreamReader bis der Stream endet? –

+2

Ja, API: _Wenn kein Byte verfügbar ist, weil das Ende des Streams erreicht wurde, wird der Wert -1 zurückgegeben. Diese Methode blockiert, bis Eingabedaten verfügbar sind, das Ende des Streams erkannt wird oder eine Ausnahme ausgelöst wird. _ –

+0

fügen Sie der Vollständigkeit halber einen 'redirectErrorStream (true)' hinzu. –

74

ich vor kurzem in dieses Problem lief und wollte nur erwähnen, dass seit Java 7 die process builder api wird erweitert. Dieses Problem kann jetzt mit gelöst werden:

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

Ich hoffe, das hilft :)

+2

Perfekte und elegante Antwort. Wenn Sie Java 7 verwenden können, ist dies absolut der richtige Weg. – Shane

+0

Dies ist die beste Antwort, auch wenn es oben gute gibt, versuchen Sie immer, die Werkzeuge zu verwenden, die standardmäßig in der Java-Toolbox enthalten sind. Java 7/8 ist eine extrem leistungsfähige und leistungsstarke Sprache - mit einem immer größer werdenden, aber effizienten Toolkit. – DtechNet

11

Ich stand vor dem ähnliche Problem und ich bin mit dem folgenden Code ein.

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

VerboseProcess aus jcabi-log Versuchen:

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

Die Klasse startet einen Hintergrund-Thread, hört auf den Ausgangsstrom, und es logs.

0

Wenn Sie org.apache.commons.io.IOUTils von commons-io,

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