ProcessBuilder vs. Runtime.exec(): Den Unterschied verstehen
Beim Versuch, externe Befehle aus Java auszuführen, stoßen Entwickler oft auf eine Diskrepanz im Verhalten zwischen Runtime.exec() und ProcessBuilder.start().
Runtime.exec():
Die Verwendung von Runtime.getRuntime().exec() beinhaltet ein zweistufiger Prozess: Tokenisierung und Ausführung. Die Eingabezeichenfolge wird vor der Ausführung analysiert und in ein Array von Argumenten umgewandelt.
ProcessBuilder:
Im Gegensatz dazu funktioniert ProcessBuilder anders. Seine Konstruktoren akzeptieren ein varargs-Array oder eine Liste von Zeichenfolgen, wobei jede Zeichenfolge ein einzelnes Argument darstellt. Die Argumente werden dann zu einer einzigen Zeichenfolge zusammengefasst, die an das Betriebssystem übergeben wird.
Auswirkungen auf die Ausführung:
Dieser Unterschied in der Argumentbehandlung kann Auswirkungen auf die Ausführung haben Befehl. Wenn der Befehl beispielsweise Leerzeichen enthält, übernimmt Runtime.exec() automatisch die Tokenisierung, während ProcessBuilder das explizite Erstellen des Argumentarrays oder der Argumentliste erfordert.
Beispiel:
Betrachten Sie den folgenden Befehl mit Leerzeichen:
"C:\DoStuff.exe -arg1 -arg2"
Verwenden von Runtime.exec():
Process p = Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");
In diesem Fall wird der Befehl wie vorgesehen ausgeführt , und der ExitValue ist 0.
Verwendung von ProcessBuilder:
Process p = (new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2")).start();
Die direkte Verwendung von ProcessBuilder ohne Tokenisierung führt jedoch zu einem Fehler oder unerwartetem Verhalten und gibt eine zurück Exit-Wert von 1001. Um dies zu korrigieren, müssen Sie das Argument-Array explizit erstellen:
Process p = (new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2")).start();
Zusammenfassung:
Im Allgemeinen ist es bei der Verwendung von ProcessBuilder wichtig, Folgendes bereitzustellen die Argumente als separate Liste oder Array, wobei jedes einzelne Argument explizit angegeben wird. Dieser zusätzliche Schritt stellt sicher, dass die Argumente korrekt analysiert werden und der externe Befehl wie vorgesehen ausgeführt wird.
Das obige ist der detaillierte Inhalt vonRuntime.exec() vs. ProcessBuilder.start(): Wann sollte ich jedes verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!