Pregunta

Estoy intentando conseguir el OutputStream del Process iniciado por exec() a la consola. ¿Cómo puede hacerse esto?

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();
        }
    }
}
¿Fue útil?

Solución

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

Otros consejos

Hace poco se encontró con este problema y sólo quería mencionar que desde el 7 de Java proceso de API constructor 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();

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

Me enfrentaba 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();

Trate VerboseProcess de jcabi-log :

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

La clase comienza un subproceso de fondo, escuchas a la corriente de salida, y lo registra.

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

Sé que esto es una pregunta muy antigua, pero una mejor alternativa para las respuestas anteriores sería

ProcessBuilder builder = new ProcessBuilder(command);
builder.inheritIO();
Process p = builder.start();

A partir de los documentos de ProcessBuilder.inheritIO(),

  

Define el origen y el destino de lo normal subproceso de E / S que es el   mismas que las del actual proceso de Java.

Espero que esto ayude a alguien!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top