2011-12-13 21 views
90

¿Hay alguna manera de ejecutar esta línea de comando dentro de una aplicación Java?Ejecutando la línea de comando en Java

java -jar map.jar time.rel test.txt debug 

Puedo ejecutarlo con el comando pero no pude hacerlo dentro de Java.

+0

He tratado, Runtime rt = Runtime.getRuntime(); Proceso proc = rt.exec ("localhost ping"); – Ataman

+0

¿Desea iniciar una máquina virtual desde otra máquina virtual? – chance

Respuesta

141
Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec("java -jar map.jar time.rel test.txt debug"); 

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

+0

es normal que cuando trato de enviarlo a la consola solo emita algo como esto: [email protected] – Ataman

+7

Use 'pr.getInputStream()'. Aquí hay un ejemplo detallado: http://www.linglom.com/2007/06/06/how-to-run-command-line-or-execute-external-application-from-java/ – kol

+5

Es útil verificar qué el proceso vuelve con. Puedes obtener eso con pr.waitFor(). Por lo tanto, se ve así: 'int retVal = pr.waitFor()'. Entonces, si no es 0, puede abortar/limpiar. – Shiki

3
Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 
5
Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 
3

Ha intentado el comando exec dentro de la clase en tiempo de ejecución?

Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug") 

Runtime - Java Documentation

8
import java.io.*; 

Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 

Considere lo siguiente si llegas a tener más problemas, pero supongo que lo anterior va a trabajar para usted:

Problems with Runtime.exec()

41

Puede también mire la salida de esta manera:

final Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 

new Thread(new Runnable() { 
    public void run() { 
    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = null; 

    try { 
     while ((line = input.readLine()) != null) 
      System.out.println(line); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    } 
}).start(); 

p.waitFor(); 

Y no olvide, si está ejecutando en Windows, debe poner "cmd/c" delante de su comando.

+4

¡También puede usar p.getErrorStream para entender por qué su comando está roto! – jakebeal

+0

@Craigo: cualquier referencia con respecto a su declaración "cmd/c"? thx – Campa

+2

En realidad, creo que solo necesitas el "cmd/c", si quieres ejecutar un comando de Windows, como "copiar". Disculpas por la confusión. – Craigo

14

Para evitar que el proceso llamado sea bloqueado si genera una gran cantidad de datos en la salida estándar y/o error, debe usar la solución provista por Craigo. Tenga en cuenta también que ProcessBuilder es mejor que Runtime.getRuntime(). Exec(). Esto se debe a un par de razones: tokenizes mejor los argumentos, y también se encarga de la salida estándar de error (también ver here).

ProcessBuilder builder = new ProcessBuilder("cmd", "arg1", ...); 
builder.redirectErrorStream(true); 
final Process process = builder.start(); 

// Watch the process 
watch(process); 

Utilizo una nueva función "ver" para recopilar estos datos en un nuevo hilo. Este hilo finalizará en el proceso de llamada cuando finalice el proceso llamado.

private static void watch(final Process process) { 
    new Thread() { 
     public void run() { 
      BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      String line = null; 
      try { 
       while ((line = input.readLine()) != null) { 
        System.out.println(line); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }.start(); 
} 
3

qué sobre

public class CmdExec { 

public static Scanner s = null; 


public static void main(String[] args) throws InterruptedException, IOException { 
    s = new Scanner(System.in); 
    System.out.print("$ "); 
    String cmd = s.nextLine(); 
    final Process p = Runtime.getRuntime().exec(cmd); 

    new Thread(new Runnable() { 
     public void run() { 
      BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line = null; 

      try { 
       while ((line = input.readLine()) != null) { 
        System.out.println(line); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 

    p.waitFor(); 
    } 

} 
Cuestiones relacionadas