Estoy usando el tiempo de ejecución para ejecutar comandos del símbolo del sistema desde mi programa Java. Sin embargo, no sé cómo puedo obtener el resultado que devuelve el comando.
Aquí está mi código:
Runtime rt = Runtime.getRuntime();
String[] commands = {"system.exe", "-send" , argument};
Process proc = rt.exec(commands);
Intenté hacerlo System.out.println(proc);pero eso no me devolvió nada. La ejecución de ese comando debería devolver dos números separados por punto y coma. ¿Cómo podría obtener esto en una variable para imprimir?
Aquí está el código que estoy usando ahora:
String[] commands = {"system.exe", "-get t"};
Process proc = rt.exec(commands);
InputStream stdIn = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdIn);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<OUTPUT>");
while ((line = br.readLine()) != null)
System.out.println(line);
System.out.println("</OUTPUT>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
Pero no obtengo nada como mi salida, pero cuando ejecuto ese comando, funciona bien.

pwd && lsno solo ejecuta un solo archivo, cuando lo hace en un shell, ejecuta tanto los ejecutables/bin/pwdcomo los/bin/lsejecutables. Si quieres hacer cosas así dentro de Java, tendrás que hacer algo así{"/bin/bash","-c", "pwd && ls"}. Probablemente ya no tenga la pregunta, pero otras personas sí, así que pensé que podría responderla.stdoutystderrsalida limitados . Si no los escucha al mismo tiempo, uno de ellos se llenará mientras lee el otro. El programa que está escuchando bloqueará el intento de escribir en el búfer lleno, mientras que en el otro extremo su programa bloqueará el intento de leer desde un búfer que nunca volveráEOF. Usted debe leer de ambas corrientes al mismo tiempo.Una forma más rápida es esta:
Que es básicamente una versión condensada de esto:
Sé que esta pregunta es antigua, pero estoy publicando esta respuesta porque creo que puede ser más rápido.
fuente
\Aen una expresión regular significa el comienzo de la cadena y tuve que escapar de la barra.Además de utilizar
ProcessBuilderSenthil como se sugiere, asegúrese de leer e implementar todas las recomendaciones de When Runtime.exec () no lo hará .fuente
ProcessBuildercomo ahora se recomienda dos veces. Usando aProcessBuilder, es posible fusionar los flujos de salida y error para facilitar el consumo de ambos a la vez.Si el uso ya tiene Apache commons-io disponible en el classpath, puede usar:
fuente
También podemos usar flujos para obtener la salida del comando:
fuente
@Senthil y @Arend responden ( https://stackoverflow.com/a/5711150/2268559 ) mencionado
ProcessBuilder. Aquí está el ejemplo que se usaProcessBuildercon la especificación de variables de entorno y la carpeta de trabajo para el comando:fuente
Al momento de escribir esto, todas las otras respuestas que incluyen código pueden resultar en puntos muertos.
Los procesos tienen un búfer limitado
stdoutystderrsalida. Si no los escucha al mismo tiempo, uno de ellos se llenará mientras intenta leer el otro. Por ejemplo, podría estar esperando leerstdoutmientras el proceso está esperando para escribirstderr. No puede leer desde elstdoutbúfer porque está vacío y el proceso no puede escribir en elstderrbúfer porque está lleno. Cada uno se espera el uno al otro para siempre.Aquí hay una posible forma de leer la salida de un proceso sin riesgo de puntos muertos:
La clave es usar
ProcessBuilder.redirectErrorStream(true)cuál redirigirástderra lastdoutsecuencia. Esto le permite leer una sola secuencia sin tener que alternar entrestdoutystderr. Si desea implementar esto manualmente, deberá consumir las secuencias en dos subprocesos diferentes para asegurarse de que nunca bloquee.fuente
Si escribe en Kotlin, puede usar:
fuente
Adaptado de la respuesta anterior:
fuente
Más o menos lo mismo que otros fragmentos en esta página, pero simplemente organizando las cosas sobre una función , aquí vamos ...
La función de clase:
fuente
Intenta leer
InputStreamel tiempo de ejecución:Es posible que también deba leer la secuencia de error (
proc.getErrorStream()) si el proceso está imprimiendo una salida de error. Puede redirigir la secuencia de error a la secuencia de entrada si la usaProcessBuilder.fuente