2011-12-13 14 views
90

Esiste un modo per eseguire questa riga di comando all'interno di un'applicazione Java?Esecuzione della riga di comando in Java

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

Posso eseguirlo con comando ma non potevo farlo all'interno di Java.

+0

ho cercato, Runtime rt = Runtime.getRuntime(); Process proc = rt.exec ("ping localhost"); – Ataman

+0

Vuoi avviare una VM da un'altra VM? – chance

risposta

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

è normale che quando provo ad emetterlo in console, emette solo qualcosa di simile a questo: [email protected] – Ataman

+7

Usa 'pr.getInputStream()'. Ecco un esempio dettagliato: http://www.linglom.com/2007/06/06/how-to-run-command-line-or-execute-external-application-from-java/ – kol

+5

È utile controllare cosa il processo ritorna con. Puoi ottenerlo con pr.waitFor(). Quindi assomiglia a questo: 'int retVal = pr.waitFor()'. Quindi se non è 0, puoi interrompere/ripulire. – 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"); 
8
import java.io.*; 

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

Si consideri il seguente se si esegue in eventuali ulteriori problemi, ma credo che quanto sopra lavorerà per voi:

Problems with Runtime.exec()

41

Puoi guarda anche l'output in questo modo:

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(); 

E non dimenticare, se stai utilizzando Windows, devi mettere "cmd/c" davanti al tuo comando.

+4

Puoi anche usare p.getErrorStream per capire perché il tuo comando è rotto! – jakebeal

+0

@Craigo: qualsiasi riferimento alla tua istruzione "cmd/c"? grazie – Campa

+2

In realtà, penso che ti serva solo il "cmd/c", se vuoi eseguire un comando di Windows, come "copia". Scuse per la confusione. – Craigo

14

Per evitare che il processo chiamato venga bloccato se emette molti dati sullo standard output e/o errore, è necessario utilizzare la soluzione fornita da Craigo. Si noti inoltre che ProcessBuilder è migliore di Runtime.getRuntime(). Exec(). Questo è per un paio di motivi: migliora gli argomenti e si occupa anche dell'output dello standard di errore (controllare anche here).

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

// Watch the process 
watch(process); 

Uso una nuova funzione "watch" per raccogliere questi dati in una nuova discussione. Questo thread terminerà nel processo chiamante quando termina il processo chiamato.

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

che dire

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(); 
    } 

} 
Problemi correlati