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() : pourquoi se comportent-ils différemment lors de l'exécution de commandes externes ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-15 02:54:02827parcourir

ProcessBuilder vs Runtime.exec(): Why Do They Behave Differently When Executing External Commands?

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!

Déclaration:
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