2010-10-14 17 views
25

Estoy tratando de obtener el OutputStream del Process iniciado por exec() en la consola. ¿Cómo puede hacerse esto?Printing Runtime exec() OutputStream a la consola

Aquí hay un código 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(); 
     } 
    } 
} 

Respuesta

2

Es necesario empezar un nuevo hilo que lea flujo de salida terminal y copiarlo en la consola, después de llamar Process.waitFor()

+3

Para todos los que vengan a esta pregunta hoy en día: desplazarse hacia abajo, hay una mejor respuesta a continuación – forresthopkinsa

32

I creer que esto es lo que está buscando:

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

tengo una pregunta para su solución: ¿No hay necesidad de usar process.waitFor()? Funciona también sin pero ¿por qué? ¿El InputStreamReader espera hasta que termina la secuencia? –

+2

Sí, API: _Si no hay ningún byte disponible porque se ha alcanzado el final de la secuencia, se devuelve el valor -1. Este método bloquea hasta que los datos de entrada estén disponibles, se detecta el final de la secuencia o se lanza una excepción. –

+0

agrega un 'redirectErrorStream (true)' para completar. –

74

poco me encontré con este problema y sólo quería mencionar que desde el 7 de java process builder api se ha ampliado. Este problema ahora se puede resolver con:

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

Espero que esto ayude :)

+2

Respuesta perfecta y elegante. Si puede usar Java 7, este es absolutamente el camino a seguir. – Shane

+0

Esta es la mejor respuesta, aunque hay algunas buenas, trate de usar las herramientas que vienen en la caja de herramientas de Java por defecto. Java 7/8 es un lenguaje extremadamente capaz y poderoso, con un conjunto de herramientas siempre en expansión pero eficiente. – DtechNet

11

que se enfrentaron al problema similar y estoy usando el siguiente código.

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

Trate VerboseProcess de jcabi-log:

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

La clase comienza un subproceso de fondo, escucha el flujo de salida, y la registra.

0

Si puede utilizar org.apache.commons.io.IOUTils de commons-io,

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