Heim  >  Artikel  >  Java  >  ProcessBuilder vs. Runtime.exec(): Wann sollte welcher zum Ausführen externer Befehle verwendet werden?

ProcessBuilder vs. Runtime.exec(): Wann sollte welcher zum Ausführen externer Befehle verwendet werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-17 04:49:03915Durchsuche

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

Den Unterschied zwischen ProcessBuilder und Runtime.exec() verstehen

Beim Ausführen externer Befehle aus Java-Code stoßen Entwickler häufig auf zwei gängige Methoden: Runtime.getRuntime().exec(...) und neuer ProcessBuilder(...).start(). Obwohl diese Methoden ähnlich erscheinen, weisen sie wesentliche Unterschiede auf, die sich auf die Ausführung von Befehlen auswirken können.

Überladung und Tokenisierung

Runtime.exec() bietet sowohl Single-String- als auch Array-Überladungen. Bei Verwendung der Einzelzeichenfolgenüberladung wird die bereitgestellte Zeichenfolge in ein Array von Argumenten tokenisiert. Dieses Tokenisierungsverhalten gilt nicht für ProcessBuilder. ProcessBuilder-Konstruktoren akzeptieren nur varargs-Arrays oder Listen von Zeichenfolgen, vorausgesetzt, jede Zeichenfolge stellt ein einzelnes Argument dar.

Auswirkungen auf die Befehlsausführung

Lassen Sie uns diesen Unterschied anhand eines Beispiels veranschaulichen. Unter Windows führt der folgende Runtime.exec()-Aufruf:

Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");

das Programm „DoStuff.exe“ mit den Argumenten „-arg1“ und „-arg2“ aus. Durch die Tokenisierung wird sichergestellt, dass der Befehl ordnungsgemäß analysiert wird.

Im Gegensatz dazu schlägt der folgende ProcessBuilder-Aufruf fehl, es sei denn, ein Programm mit dem Namen „DoStuff.exe -arg1 -arg2“ ist im Verzeichnis C: vorhanden:

ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2");

Um den Befehl korrekt mit ProcessBuilder auszuführen, müssen Sie die Argumente entweder separat angeben:

ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2");

Oder eine Liste verwenden:

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

Auswirkungen auf die Fehlerbehandlung

Die Unterschiede in der Befehls-Tokenisierung können sich auf die Fehlerbehandlung auswirken. Wenn ProcessBuilder beispielsweise das angegebene Programm nicht findet, erhalten Sie möglicherweise einen Fehlercode von 1001 anstelle des erwarteten Exit-Werts von 0. Das Verständnis des Tokenisierungsverhaltens von Runtime.exec() und ProcessBuilder ist für die Fehlerbehebung solcher Fehler von entscheidender Bedeutung.

Das obige ist der detaillierte Inhalt vonProcessBuilder vs. Runtime.exec(): Wann sollte welcher zum Ausführen externer Befehle verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn