2012-05-23 25 views
13
Process p = Runtime.getRuntime().exec(command); 
    is = p.getInputStream(); 
    byte[] userbytes = new byte[1024]; 
    is.read(userbytes); 

Quiero ejecutar un comando de shell en Linux OS desde Java. Pero los informes PMD dicen que no use java Runtime.exec(). ¿Por qué? Cual es la razon ? ¿Hay alguna alternativa para Runtime.exec()?¿Por qué debería evitar el uso de Runtime.exec() en java?

+2

¿Qué mensaje está mostrando pmd exactamente? – Tudor

+0

Descripción del problema: No utilice Runtime.exec() para ejecutar comandos – kannanrbk

+1

Esta es una afirmación absurda, sin ningún respaldo – ControlAltDel

Respuesta

33

A menos que esté atascado en una antigua JVM, java.lang.ProcessBuilder hace que sea mucho más fácil especificar un proceso, configurar su entorno, generarlo y manejar sus descriptores de archivos.

Esta clase se utiliza para crear procesos del sistema operativo.

Cada instancia de ProcessBuilder administra una colección de atributos de proceso. El método start() crea una nueva instancia Process con esos atributos. El método start() se puede invocar repetidamente desde la misma instancia para crear nuevos subprocesos con atributos idénticos o relacionados.

...

Inicio de un nuevo proceso que utiliza el directorio predeterminado y el medio ambiente de trabajo es fácil:

Process p = new ProcessBuilder("myCommand", "myArg").start(); 

Este es un ejemplo que se inicia un proceso con un directorio de trabajo modificado y el medio ambiente:

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2"); 
Map<String, String> env = pb.environment(); 
env.put("VAR1", "myValue"); 
env.remove("OTHERVAR"); 
env.put("VAR2", env.get("VAR1") + "suffix"); 
pb.directory(new File("myDir")); 
Process p = pb.start(); 
+1

Gracias Mike. ProcessBuilder funcionó excelente en mi caso. Mucho más fácil que con Runtime.exec(). Más información y ejemplos en http://docs.oracle.com/javase/6/docs/api/java/lang/ProcessBuilder.html – tremendows

Cuestiones relacionadas