Exécuter des commandes externes avec Java : Runtime.exec() vs ProcessBuilder
En Java, les développeurs disposent de deux options principales pour exécuter des commandes externes : Runtime.exec() et ProcessBuilder.start(). Bien que les deux méthodes servent le même objectif, elles présentent des différences subtiles qui peuvent avoir un impact sur le processus d'exécution.
Runtime.exec()
Runtime.exec() vous permet de exécuter une commande externe en fournissant une seule chaîne ou un tableau de chaînes contenant la commande et ses arguments. Par exemple :
Process p = Runtime.getRuntime().exec("command -arg1 -arg2"); p.waitFor();
Lors de l'utilisation de Runtime.exec() avec une seule chaîne, la chaîne sera tokenisée dans un tableau d'arguments. Cette tokenisation peut entraîner un comportement inattendu si la commande ou les arguments contiennent des espaces ou des caractères spéciaux.
ProcessBuilder
ProcessBuilder offre un meilleur contrôle sur le processus d'exécution de la commande. Cela vous oblige à spécifier la commande et ses arguments sous forme de chaînes distinctes dans un tableau ou une liste :
ProcessBuilder b = new ProcessBuilder("command", "-arg1", "-arg2"); Process p = b.start(); p.waitFor();
Contrairement à Runtime.exec(), ProcessBuilder ne tokenise pas les arguments, il est donc essentiel de s'assurer que le La commande et les arguments sont fournis sous forme de chaînes individuelles.
Différences de comportement
La principale différence entre les deux méthodes réside dans la manière dont elles envoient des commandes au système d'exploitation. Runtime.exec() utilise les arguments tokenisés, tandis que ProcessBuilder suppose que les arguments fournis ont déjà été tokenisés.
Cette différence peut entraîner des problèmes lors de l'utilisation de ProcessBuilder avec des commandes nécessitant une séparation d'arguments spécifique. Par exemple, sur les systèmes Windows, une commande telle que :
C:\MyProgram.exe -arg1 -arg2
sera reconnue comme une commande unique par Runtime.exec(), mais son exécution échouera à l'aide de ProcessBuilder à moins que vous ne spécifiiez chaque argument séparément :
C:\MyProgram.exe" "-arg1" "-arg2"
Conclusion
Runtime.exec() et ProcessBuilder peuvent exécuter efficacement des commandes externes en Java. Cependant, comprendre les différences subtiles entre les deux méthodes est crucial pour garantir une exécution correcte des commandes et éviter tout comportement inattendu. En cas de doute, opter pour ProcessBuilder offre un meilleur contrôle sur le processus d'exécution des commandes et évite les problèmes potentiels liés à la tokenisation des arguments.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!