La biblioteca de clases de Java representa los procesos externos que utilizan la clase java.lang.Process
. Los procesos pueden ser generado mediante un java.lang.ProcessBuilder
:
Process process = new ProcessBuilder("processname").start();
o la interfaz más antigua expuesta por los exec
métodos sobrecargados de la clase java.lang.Runtime
:
Process process = Runtime.getRuntime().exec("processname");
Ambos le fragmentos de código va a generar un nuevo proceso, el cual generalmente se ejecuta de forma asincrónica y puede interactuar con el objeto Process
resultante. Si necesita verificar que el proceso haya finalizado (o esperar a que termine), no olvide verificar que el valor de salida (código de salida) devuelto por process.exitValue()
o process.waitFor()
es el esperado (0 para la mayoría de los programas), ya que no se lanza una excepción si el proceso sale anormalmente.
También tenga en cuenta que el código adicional es a menudo necesaria para manejar el proceso de E/S correctamente, tal como se describe en el documentation for the Process
class (énfasis añadido):
Por defecto, el subproceso creado no tiene su propio terminal o consola. Todas sus operaciones de E/S estándar (es decir, stdin, stdout, stderr) se redirigirán al proceso principal, donde se puede acceder a ellas a través de las transmisiones obtenidas utilizando los métodos getOutputStream(), getInputStream() y getErrorStream(). El proceso principal utiliza estas secuencias para alimentar la entrada y obtener resultados del subproceso. Debido a que algunas plataformas nativas solo proporcionan un tamaño de búfer limitado para las corrientes de entrada y salida estándar, la falla al escribir rápidamente la secuencia de entrada o leer el flujo de salida del subproceso puede hacer que el subproceso bloquee, o incluso bloquee.
Una forma de asegurarse de que E/S se maneja correctamente y que el valor de salida indica el éxito es el uso de una biblioteca como jproc
que se ocupa de las complejidades de la captura de stdout y stderr, y ofrece una interfaz síncrona simple de ejecutar procesos externos:
ProcResult result = new ProcBuilder("processname").run();
jproc
está disponible a través de experta en el centro:
<dependency>
<groupId>org.buildobjects</groupId>
<artifactId>jproc</artifactId>
<version>2.2.0</version>
</dependency>
Tenga en cuenta que debe utilizar la forma '.exec (String [])' del método , no el formulario de cadena simple '.exec (String)' que * no es un procesador de línea de comando * - simplemente se divide en espacios. Dan el mismo resultado para este ejemplo 'tree.com/A' pero son diferentes si se les da, por ejemplo, un nombre de archivo que tiene espacios en él. –
También debe enjuagar el flujo de error y, si es necesario, esperar el valor de salida del proceso. –