48 votes

Comment exécuter des commandes Linux en Java ?

Je veux créer la différence entre deux fichiers. J'ai essayé de chercher un code en Java qui le fasse, mais je n'ai pas trouvé de code simple ou de code utilitaire pour cela. J'ai donc pensé que si je pouvais exécuter la commande linux diff/sdiff à partir de mon code Java et lui faire renvoyer un fichier qui stocke la différence, ce serait génial.

Supposons qu'il existe deux fichiers, fichierA et fichierB. Je devrais être capable de stocker leur différence dans un fichier appelé fileDiff grâce à mon code Java. Ensuite, récupérer les données de fileDiff ne serait pas un problème.

61voto

paxdiablo Points 341644

Vous pouvez utiliser java.lang.Runtime.exec pour exécuter un code simple. Cela vous rend un Process et vous pouvez lire directement sa sortie standard sans avoir à stocker temporairement la sortie sur le disque.

Par exemple, voici un programme complet qui vous montrera comment faire :

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class testprog {
    public static void main(String args[]) {
        String s;
        Process p;
        try {
            p = Runtime.getRuntime().exec("ls -aF");
            BufferedReader br = new BufferedReader(
                new InputStreamReader(p.getInputStream()));
            while ((s = br.readLine()) != null)
                System.out.println("line: " + s);
            p.waitFor();
            System.out.println ("exit: " + p.exitValue());
            p.destroy();
        } catch (Exception e) {}
    }
}

Une fois compilé et exécuté, il sort :

line: ./
line: ../
line: .classpath*
line: .project*
line: bin/
line: src/
exit: 0

comme prévu.

Vous pouvez également obtenir le flux d'erreurs pour l'erreur standard du processus, et flux de sortie pour l'entrée standard du processus, ce qui est assez déroutant. Dans ce contexte, l'entrée et la sortie sont inversées puisque c'est l'entrée de le processus à celui-ci (c'est-à-dire la norme sortie du processus).

Si vous souhaitez fusionner le traitement de la sortie standard et de l'erreur à partir de Java (par opposition à l'utilisation de l'option 2>&1 dans la commande actuelle), vous devriez vous pencher sur ProcessBuilder .

22voto

Naveen Points 61

Vous pouvez également écrire un fichier shell script et invoquer ce fichier à partir du code java. comme indiqué ci-dessous

{
   Process proc = Runtime.getRuntime().exec("./your_script.sh");                        
   proc.waitFor();
}

Ecrivez les commandes linux dans le fichier script, une fois l'exécution terminée vous pouvez lire le fichier diff en Java.

L'avantage de cette approche est que vous pouvez modifier les commandes sans changer le code Java.

14voto

codaddict Points 154968

Il n'est pas nécessaire de stocker la différence dans un troisième fichier et de la lire ensuite. Au lieu de cela, vous utilisez la fonction Runtime.exec

Process p = Runtime.getRuntime().exec("diff fileA fileB");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((s = stdInput.readLine()) != null) {
        System.out.println(s);
}

7voto

b10n1k Points 498

Essayez d'utiliser unix4j . il s'agit d'une bibliothèque en java pour exécuter une commande linux. par exemple si vous avez une commande comme : cat test.txt | grep "Tuesday" | sed "s/kilogramme/kg/g" | sort dans ce programme deviendra : Unix4j.cat("test.txt").grep("Tuesday").sed("s/kilogram/kg/g").sort() ;

4voto

YoK Points 8221
Runtime run = Runtime.getRuntime();  
//The best possible I found is to construct a command which you want to execute  
//as a string and use that in exec. If the batch file takes command line arguments  
//the command can be constructed a array of strings and pass the array as input to  
//the exec method. The command can also be passed externally as input to the method.  

Process p = null;  
String cmd = "ls";  
try {  
    p = run.exec(cmd);  

    p.getErrorStream();  
    p.waitFor();

}  
catch (IOException e) {  
    e.printStackTrace();  
    System.out.println("ERROR.RUNNING.CMD");  

}finally{
    p.destroy();
}

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