Impresión de tiempo de ejecución exec () OutputStream a la consola
-
30-09-2019 - |
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();
}
}
}
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!