ProcessBuilder vs Runtime.exec() : comprendre la différence
Lorsqu'ils tentent d'exécuter des commandes externes à partir de Java, les développeurs rencontrent souvent une divergence dans le comportement entre Runtime.exec() et ProcessBuilder.start().
Runtime.exec() :
L'utilisation de Runtime.getRuntime().exec() implique un processus en deux étapes : tokenisation et exécution. La chaîne d'entrée est analysée et convertie en un tableau d'arguments avant d'être exécutée.
ProcessBuilder :
En revanche, ProcessBuilder fonctionne différemment. Ses constructeurs acceptent un tableau varargs ou une liste de chaînes, où chaque chaîne représente un argument individuel. Les arguments sont ensuite combinés en une seule chaîne qui est transmise au système d'exploitation.
Impact sur l'exécution :
Cette différence dans la gestion des arguments peut avoir un impact sur l'exécution du commande. Par exemple, si la commande inclut des espaces, Runtime.exec() gérera automatiquement la tokenisation, alors que ProcessBuilder nécessite la création explicite du tableau ou de la liste d'arguments.
Exemple :
Considérez la commande suivante avec des espaces :
"C:\DoStuff.exe -arg1 -arg2"
Utilisation de Runtime.exec():
Process p = Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");
Dans ce cas, la commande sera exécutée comme prévu , et la valeur exitValue sera 0.
Utilisation de ProcessBuilder :
Process p = (new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2")).start();
Cependant, l'utilisation directe de ProcessBuilder sans tokenisation entraînera une erreur ou un comportement inattendu, renvoyant un exitValue de 1001. Pour corriger cela, vous devez créer explicitement le tableau d'arguments :
Process p = (new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2")).start();
Résumé :
En général, lors de l'utilisation de ProcessBuilder, il est essentiel de fournir les arguments sous forme de liste ou de tableau distinct, indiquant explicitement chaque argument individuel. Cette étape supplémentaire garantit que les arguments sont analysés correctement et que la commande externe est exécutée comme prévu.
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!