2010-09-22 21 views
20

¿Hay alguna forma de iniciar un proceso en Java? en .Net esto se hace con, por ejemplo:¿Iniciando un proceso en Java?

System.Diagnostics.Process.Start("processname"); 

¿Existe un equivalente en Java, por lo que puedo entonces dejar que el usuario pueda encontrar fácilmente la aplicación y entonces trabajaría para cualquier sistema operativo?

Respuesta

23

http://www.rgagnon.com/javadetails/java-0014.html

import java.io.*; 
public class CmdExec { 

    public static void main(String args[]) { 
    try { 
     String line; 
     Process p = Runtime.getRuntime().exec 
     (System.getenv("windir") +"\\system32\\"+"tree.com /A"); 
     BufferedReader input = 
     new BufferedReader 
      (new InputStreamReader(p.getInputStream())); 
     while ((line = input.readLine()) != null) { 
     System.out.println(line); 
     } 
     input.close(); 
    } 
    catch (Exception err) { 
     err.printStackTrace(); 
    } 
    } 
} 

Usted puede obtener la ruta local usando propiedades del sistema o un enfoque similar.

http://download.oracle.com/javase/tutorial/essential/environment/sysprop.html

+5

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. –

+2

También debe enjuagar el flujo de error y, si es necesario, esperar el valor de salida del proceso. –

18

Consulte Runtime.exec() y la clase Process. En su forma más simple:

Process myProcess = Runtime.getRuntime().exec(command); 
... 

Tenga en cuenta que también hay que lea el proceso de salida (por ejemplo: myProcess.getInputStream()) - o el proceso va a colgar en algunos sistemas. Esto puede ser muy confuso la primera vez, y debe incluirse en cualquier introducción a estas API. Vea la respuesta de James P. para un ejemplo.

También puede que desee ver en la nueva clase ProcessBuilder, lo que hace que sea más fácil cambiar las variables de entorno y para invocar subprocesos:

Process myProcess = new ProcessBuilder(command, arg).start(); 
... 
+0

también es necesario para leer la salida del proceso - p.getInputStream() - o el proceso va a colgar en algunos sistemas. Esto puede ser muy confuso la primera vez, y debe incluirse en cualquier introducción a estas API. Vea la respuesta de James P. para un ejemplo. –

+0

@Andy Gracias. Incorporé tu comentario a mi respuesta, si no te importa. – NullUserException

+0

¿Qué sucede si el reproductor multimedia predeterminado es VLC y quiero, por ejemplo, abrir "algún video.avi" y quiero que use la aplicación predeterminada que es vlc? – jmasterx

7

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> 
0

Aquí es la lógica. Supóngase que se desea ejecutar la calculadora en las ventanas utilizando Java:

Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "calc.exe"); 
Cuestiones relacionadas