ProcessBuilder 與Runtime.exec():了解差異
當嘗試從Java 執行外部命令時,開發人員經常會遇到差異Runtime.exec()和之間的行為ProcessBuilder.start().
Runtime.exec():
使用Runtime.getRuntime().exec() 涉及兩個步驟的過程:標記化和執行。輸入字串在執行之前會被解析並轉換為參數數組。
ProcessBuilder:
相較之下,ProcessBuilder 的操作方式有所不同。它的建構子接受一個可變參數數組或字串列表,其中每個字串代表一個單獨的參數。然後將參數組合成單一字串並傳遞給作業系統。
對執行的影響:
參數處理中的這種差異可能會影響指令。例如,如果指令包含空格,Runtime.exec() 將自動處理標記化,而 ProcessBuilder 需要明確建立參數陣列或清單。
範例:
考慮以下帶空格的指令:
"C:\DoStuff.exe -arg1 -arg2"
使用Runtime.exec()
Process p = Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");
:
在這種情況下,命令將如預期執行,exitValue將為 0。
Process p = (new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2")).start();
:
Process p = (new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2")).start();
但是,不進行標記化而直接使用 ProcessBuilder 會導致錯誤或意外行為,傳回 exitValue 1001。要修正此問題,您必須明確建立參數陣列:
摘要:
一般來說,使用ProcessBuilder 時,必須以單獨的清單或數組的形式提供參數,明確指示每個單獨的參數。此附加步驟可確保正確解析參數並按預期執行外部命令。以上是Runtime.exec() 與 ProcessBuilder.start():什麼時候該使用它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!