Maison >Java >javaDidacticiel >ProcessBuilder vs Runtime.exec() : pourquoi se comportent-ils différemment lors de l'exécution de commandes externes ?
ProcessBuilder vs Runtime.exec() : analyse des écarts
Lors de l'exécution de commandes externes en Java, on peut rencontrer des écarts entre le Runtime. getRuntime().exec(...) et new ProcessBuilder(...).start(). L'exploration suivante vise à faire la lumière sur ces différences et à fournir des solutions pour obtenir un comportement cohérent.
Gestion des arguments par défaut
Une distinction clé entre les deux approches réside dans leur gestion. d'arguments. Runtime.getRuntime().exec() attend une seule chaîne ou un tableau de chaînes, tandis que ProcessBuilder attend un tableau de chaînes ou une liste de chaînes. Lorsque vous utilisez exec() avec une seule chaîne, il tokenise la chaîne en interne pour créer un tableau d'arguments.
Comportement de ProcessBuilder
Dans le cas de ProcessBuilder, les arguments sont transmis sous forme de tableau ou de liste, où chaque élément représente un argument. Cependant, si la chaîne n'est pas correctement tokenisée, un seul argument sera formé, y compris les espaces. Cela peut entraîner un comportement inattendu, comme dans l'exemple fourni où la commande n'a pas été exécutée correctement.
Solution
Pour résoudre ce problème avec ProcessBuilder, assurez-vous que les arguments sont correctement tokenisés :
ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2");
Alternativement, une liste peut être utilisée :
List<String> params = java.util.Arrays.asList("C:\DoStuff.exe", "-arg1", "-arg2"); ProcessBuilder b = new ProcessBuilder(params);
En pré-tokenisant les arguments, le comportement souhaité peut être obtenu.
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!