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 && ls
no solo ejecuta un solo archivo, cuando lo hace en un shell, ejecuta tanto los ejecutables/bin/pwd
como los/bin/ls
ejecutables. 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.stdout
ystderr
salida 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
\A
en una expresión regular significa el comienzo de la cadena y tuve que escapar de la barra.Además de utilizar
ProcessBuilder
Senthil como se sugiere, asegúrese de leer e implementar todas las recomendaciones de When Runtime.exec () no lo hará .fuente
ProcessBuilder
como 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 usaProcessBuilder
con 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
stdout
ystderr
salida. Si no los escucha al mismo tiempo, uno de ellos se llenará mientras intenta leer el otro. Por ejemplo, podría estar esperando leerstdout
mientras el proceso está esperando para escribirstderr
. No puede leer desde elstdout
búfer porque está vacío y el proceso no puede escribir en elstderr
bú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ástderr
a lastdout
secuencia. Esto le permite leer una sola secuencia sin tener que alternar entrestdout
ystderr
. 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
InputStream
el 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