2010-10-14 28 views
25

J'essaye d'obtenir le OutputStream du Process initié par exec() à la console. Comment cela peut-il être fait?Impression Runtime exec() OutputStream à la console

Voici un code incomplet:

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

Répondre

2

Vous devez commencer un nouveau thread qui lirait flux de sortie du terminal et le copier sur la console, après l'appel Process.waitFor()

+3

Pour tous ceux qui viennent à cette question aujourd'hui: faire défiler vers le bas, il y a une meilleure réponse ci-dessous – forresthopkinsa

32

I croire que c'est ce que vous cherchez:

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

j'ai une question à votre solution: N'a-t-il pas besoin d'utiliser process.waitFor()? Cela fonctionne aussi sans mais pourquoi? InputStreamReader attend-il que le flux se termine? –

+2

Oui, API: _Si aucun octet n'est disponible car la fin du flux a été atteinte, la valeur -1 est renvoyée. Cette méthode est bloquée jusqu'à ce que les données d'entrée soient disponibles, la fin du flux est détectée ou une exception est levée. –

+0

Ajoutez un 'redirectErrorStream (true)' pour l'exhaustivité. –

74

J'ai récemment rencontré ce problème et je voulais simplement mentionner que depuis java 7 le process builder api a été élargie. Ce problème peut maintenant être résolu avec:

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

J'espère que cela aide :)

+2

Réponse parfaite et élégante. Si vous pouvez utiliser Java 7, c'est absolument le chemin à parcourir. – Shane

+0

C'est la meilleure réponse, même s'il y en a de bonnes ci-dessus, essayez toujours d'utiliser les outils qui viennent dans la boîte à outils Java par défaut. Java 7/8 est un langage extrêmement puissant et puissant, doté d'une boîte à outils toujours plus étendue et efficace. – DtechNet

11

Je face au même problème et je me sers le code suivant.

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

Essayez de VerboseProcessjcabi-log:

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

La classe démarre un thread d'arrière-plan, écoute le flux de sortie et l'enregistre.

0

Si vous pouvez utiliser org.apache.commons.io.IOUTils de commons-io,

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