Heim >Java >javaLernprogramm >Runtime.exec() vs. ProcessBuilder: Warum wird mein Befehl mit Code 1001 beendet?

Runtime.exec() vs. ProcessBuilder: Warum wird mein Befehl mit Code 1001 beendet?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-29 13:32:09696Durchsuche

Runtime.exec() vs ProcessBuilder: Why Does My Command Exit with Code 1001?

ProcessBuilder vs. Runtime.exec(): Ein Vergleich

Bei der Ausführung externer Befehle aus Java stoßen Entwickler häufig auf ein Dilemma zwischen der Verwendung von Runtime. getRuntime().exec(...) und new ProcessBuilder(...).start(). Um die Unterschiede zwischen diesen beiden Ansätzen zu beleuchten, untersuchen wir ihr Verhalten im Detail.

Fallstudie

In einem Anwendungsfall, bei dem sowohl Runtime.exec() als auch Werden ProcessBuilder zur Ausführung eines bestimmten Befehls eingesetzt, ergibt sich ein bemerkenswerter Unterschied. Mit Runtime.exec() wird der Befehl erfolgreich mit einem Exit-Wert von 0 beendet. Bei Verwendung von ProcessBuilder ist der Exit-Wert jedoch 1001 und der Befehl wird vorzeitig beendet.

Ursache

Die Diskrepanz liegt in der Art und Weise, wie exec() und ProcessBuilder Befehlsargumente verarbeiten. exec() akzeptiert eine einzelne Zeichenfolge oder ein Array von Zeichenfolgen und tokenisiert die Eingabe in Argumente. Im Gegensatz dazu erwartet ProcessBuilder entweder ein varargs-Array von Zeichenfolgen oder eine Liste, wobei jedes Element als einzelnes Argument betrachtet wird.

Lösung

Um das Problem zu beheben Stellen Sie bei ProcessBuilder sicher, dass die Befehlsargumente als separate Zeichenfolgen bereitgestellt werden. Zum Beispiel anstelle von Folgendem:

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

Verwenden Sie Folgendes:

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

Alternativ können Sie eine Liste erstellen. und übergeben Sie es wie folgt an ProcessBuilder:

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

Das obige ist der detaillierte Inhalt vonRuntime.exec() vs. ProcessBuilder: Warum wird mein Befehl mit Code 1001 beendet?. 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