web-dev-qa-db-fra.com

Comment exécuter les commandes système (linux / bsd) en utilisant Java

J'essaie d'être bon marché et d'exécuter une commande système locale (uname -a) en Java. Je cherche à récupérer la sortie de uname et à la stocker dans une chaîne. Quelle est la meilleure façon de procéder? Code actuel:

public class lame {

    public static void main(String args[]) {
        try {
            Process p = Runtime.getRuntime().exec("uname -a");
            p.waitFor();
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line=reader.readLine();

            while (line != null) {    
                System.out.println(line);
                line = reader.readLine();
            }

        }
        catch(IOException e1) {}
        catch(InterruptedException e2) {}

        System.out.println("finished.");
    }
}
36
Eric Schulman

Votre chemin n'est pas loin de ce que je ferais probablement:

Runtime r = Runtime.getRuntime();
Process p = r.exec("uname -a");
p.waitFor();
BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";

while ((line = b.readLine()) != null) {
  System.out.println(line);
}

b.close();

Gérez les exceptions dont vous vous souciez, bien sûr.

60
John Feminella

C'est la meilleure façon de procéder. Vous pouvez également utiliser le ProcessBuilder qui a un constructeur d'argument variable, de sorte que vous pouvez enregistrer une ou deux lignes de code

8
Azder

Ce que vous faites semble bien. Si votre commande ne renvoie qu'une seule chaîne, vous n'avez pas besoin de la boucle while, stockez simplement la valeur reader.readLine () dans une seule variable String.

En outre, vous devriez probablement faire quelque chose avec ces exceptions, plutôt que de simplement les avaler.

2
Andy White

Je sais que c'est très vieux mais quand même ...

Lire l'article ici: http://www.javaworld.com/article/2071275/core-Java/when-runtime-exec---won-t.html
Je crois comprendre que vous devez d'abord lire les flux de sortie et d'erreur de votre commande exécutée, puis seulement waitFor la valeur de retour de votre processus.

1
epeleg