206 votes

java runtime.getruntime () obtenir le résultat de l'exécution d'un programme en ligne de commande

Je suis en utilisant le moteur d'exécution pour exécuter l'invite de commande les commandes à partir de mon programme java. Cependant, je ne suis pas au courant de comment je peux obtenir la sortie de la commande retourne.

Voici mon code.

Runtime rt = Runtime.getRuntime();

String[] commands = {"system.exe","-send",argument};

Process proc = rt.exec(commands);

J'ai essayé de faire système..print(proc); mais cela ne retourne rien. L'exécution de cette commande doit renvoyer deux nombres séparés par un point-virgule, comment pourrais-je obtenir ce dans une variable pour l'imprimer?

Merci,

Ici c'est le code que j'utilise actuellement:

String[] commands = {"system.exe","-get t"};

Process proc = rt.exec(commands);

InputStream stdin = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);

String line = null;
System.out.println("<OUTPUT>");

while ( (line = br.readLine()) != null)
     System.out.println(line);

System.out.println("</OUTPUT>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);

Mais je ne suis pas d'obtenir quoi que ce soit que ma sortie, mais quand je lance cette commande moi-même, il fonctionne très bien.

307voto

Senthil Points 1259

Voici le chemin à parcourir:

 BufferedReader stdInput = new BufferedReader(new 
     InputStreamReader(proc.getInputStream()));

BufferedReader stdError = new BufferedReader(new 
     InputStreamReader(proc.getErrorStream()));

// read the output from the command
System.out.println("Here is the standard output of the command:\n");
String s = null;
while ((s = stdInput.readLine()) != null) {
    System.out.println(s);
}

// read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null) {
    System.out.println(s);
}
 

Mieux vaut lire le Javadoc pour plus de détails ici . ProcessBuilder serait un bon choix à utiliser

84voto

735Tesla Points 820

Voici un moyen plus rapide:

 public static String execCmd(String cmd) throws java.io.IOException {
        java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A");
        return s.hasNext() ? s.next() : "";
    }
 

Ce qui est fondamentalement une version condensée de ceci:

 public static String execCmd(String cmd) throws java.io.IOException {
        Process proc = Runtime.getRuntime().exec(cmd);
        java.io.InputStream is = proc.getInputStream();
        java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
        String val = "";
        if (s.hasNext()) {
            val = s.next();
        }
        else {
            val = "";
        }
        return val;
}
 

Je sais que cette question est ancienne, mais je poste cette réponse parce que je pense que cela pourrait être plus rapide.

11voto

Andrew Thompson Points 108505

En plus d'utiliser ProcessBuilder comme suggéré Senthil, veillez à lire et à mettre en œuvre toutes les recommandations de When Runtime.exec () .

-1voto

AOSP_junkie Points 26

Vous pouvez essayer de mettre un espace entre vos commandes: {"system.exe", "- get t"}; Il n'y a pas d'espace entre "system.exe" et "-get". Je pense que cela produirait "system.exe-get t".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X