web-dev-qa-db-fra.com

Exécution de la ligne de commande dans Java

Est-il possible d'exécuter cette ligne de commande dans une application Java?

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

Je peux l'exécuter avec la commande mais je ne pouvais pas le faire dans Java.

116
Ataman
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

176
kol

Vous pouvez également regarder la sortie comme ceci:

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

Et n'oubliez pas, si vous utilisez Windows, vous devez placer "cmd/c" devant votre commande.

48
Craigo

Pour éviter le blocage du processus appelé s'il génère beaucoup de données sur la sortie standard et/ou une erreur, vous devez utiliser la solution fournie par Craigo. Notez également que ProcessBuilder est supérieur à Runtime.getRuntime (). Exec (). C’est pour deux raisons: cela permet de mieux numériser les arguments et de prendre en charge la sortie standard des erreurs (vérifiez également ici ).

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

// Watch the process
watch(process);

J'utilise une nouvelle fonction "watch" pour rassembler ces données dans un nouveau thread. Ce fil se terminera dans le processus d'appel à la fin du processus appelé.

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();
}
18
mountrix
Runtime.getRuntime().exec("Java -jar map.jar time.rel test.txt debug");
8
Igor Popov
import Java.io.*;

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

Considérez ce qui suit si vous rencontrez d'autres problèmes, mais je suppose que ce qui précède fonctionnera pour vous:

Problèmes avec Runtime.exec ()

8
Shaun

qu'en est-il de

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

 }
4
Denis
Process p = Runtime.getRuntime().exec("Java -jar map.jar time.rel test.txt debug");
3
Wojtek Owczarczyk

Avez-vous essayé la commande exec dans la classe Runtime?

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

Runtime - Java Documentation

3
rybosome