ProcessBuilder vs. Runtime.exec(): Analyse der Diskrepanzen
Beim Ausführen externer Befehle in Java kann es zu Diskrepanzen zwischen Runtime kommen. getRuntime().exec(...) und new ProcessBuilder(...).start(). Die folgende Untersuchung zielt darauf ab, Licht auf diese Unterschiede zu werfen und Lösungen bereitzustellen, um konsistentes Verhalten zu erreichen.
Standardargumentbehandlung
Ein wesentlicher Unterschied zwischen den beiden Ansätzen liegt in ihrer Handhabung von Argumenten. Runtime.getRuntime().exec() erwartet eine einzelne Zeichenfolge oder ein Array von Zeichenfolgen, während ProcessBuilder ein Array von Zeichenfolgen oder eine Liste von Zeichenfolgen erwartet. Wenn exec() mit einer einzelnen Zeichenfolge verwendet wird, wird die Zeichenfolge intern tokenisiert, um ein Argumentarray zu erstellen.
ProcessBuilder-Verhalten
Im Fall von ProcessBuilder werden Argumente übergeben als Array oder Liste, wobei jedes Element ein Argument darstellt. Wenn die Zeichenfolge jedoch nicht ordnungsgemäß tokenisiert ist, wird ein einzelnes Argument einschließlich aller Leerzeichen gebildet. Dies kann zu unerwartetem Verhalten führen, wie im Beispiel, bei dem der Befehl nicht korrekt ausgeführt wurde.
Lösung
Um dieses Problem mit ProcessBuilder zu beheben, stellen Sie sicher, dass die Argumente ordnungsgemäß tokenisiert sind:
ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2");
Alternativ kann eine Liste verwendet werden:
List<String> params = java.util.Arrays.asList("C:\DoStuff.exe", "-arg1", "-arg2"); ProcessBuilder b = new ProcessBuilder(params);
Durch die Vor-Tokenisierung der Argumente kann das gewünschte Verhalten erreicht werden.
Das obige ist der detaillierte Inhalt vonProcessBuilder vs. Runtime.exec(): Warum verhalten sie sich beim Ausführen externer Befehle unterschiedlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!