Maison > Java > javaDidacticiel > ProcessBuilder vs Runtime.exec() : quand utiliser lequel pour exécuter des commandes externes ?

ProcessBuilder vs Runtime.exec() : quand utiliser lequel pour exécuter des commandes externes ?

Patricia Arquette
Libérer: 2024-11-17 04:49:03
original
1010 Les gens l'ont consulté

ProcessBuilder vs. Runtime.exec(): When to Use Which for Executing External Commands?

Comprendre la différence entre ProcessBuilder et Runtime.exec()

Lors de l'exécution de commandes externes à partir de code Java, les développeurs rencontrent souvent deux méthodes courantes : Runtime.getRuntime().exec(...) et new ProcessBuilder(...).start(). Bien que ces méthodes semblent similaires, elles présentent des différences clés qui peuvent avoir un impact sur l'exécution des commandes.

Surcharge et tokenisation

Runtime.exec() propose à la fois des méthodes à chaîne unique et surcharges de tableaux. Lors de l'utilisation de la surcharge d'une seule chaîne, la chaîne fournie est tokenisée dans un tableau d'arguments. Ce comportement de tokenisation ne s'applique pas à ProcessBuilder. Les constructeurs ProcessBuilder n'acceptent que les tableaux varargs ou les listes de chaînes, en supposant que chaque chaîne représente un argument individuel.

Impact sur l'exécution des commandes

Illustrons cette différence avec un exemple. Sous Windows, l'invocation Runtime.exec() suivante :

Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");
Copier après la connexion

exécutera le programme "DoStuff.exe" avec les arguments "-arg1" et "-arg2". La tokenisation garantit que la commande est correctement analysée.

En revanche, l'invocation suivante de ProcessBuilder échouera à moins qu'un programme nommé « DoStuff.exe -arg1 -arg2 » n'existe dans le répertoire C: :

ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2");
Copier après la connexion

Pour exécuter correctement la commande à l'aide de ProcessBuilder, vous devez soit fournir les arguments séparément :

ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2");
Copier après la connexion

Ou utiliser un list :

List<String> params = java.util.Arrays.asList("C:\DoStuff.exe", "-arg1", "-arg2");
ProcessBuilder b = new ProcessBuilder(params);
Copier après la connexion

Implications pour la gestion des erreurs

Les différences dans la tokenisation des commandes peuvent affecter la gestion des erreurs. Par exemple, si ProcessBuilder ne parvient pas à trouver le programme spécifié, vous pouvez obtenir un code d'erreur de 1001 au lieu de la valeur de sortie attendue de 0. Comprendre le comportement de tokenisation de Runtime.exec() et ProcessBuilder est crucial pour déboguer de telles erreurs.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal