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");
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");
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");
Ou utiliser un list :
List<String> params = java.util.Arrays.asList("C:\DoStuff.exe", "-arg1", "-arg2"); ProcessBuilder b = new ProcessBuilder(params);
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!