自 JDK 1.0 以來,Runtime.exec() 是啟動外部進程的唯一標準方式,但缺點明顯:無法指定工作目錄、無法修改環境變數、錯誤流與輸出流分離處理繁瑣、命令參數解析依賴平台實現。JDK 5 引入 ProcessBuilder,以建構者模式靈活配置進程屬性,並提供流合併、目錄、環境變數完全控制,成為現代 Java 進程管理的首選。
| 屬性 | 說明 | 對應方法 |
|---|---|---|
| command | 命令與參數列表(List<String>) | command(List), command(String...) |
| environment | 環境變數映射(Map<String,String>) | environment() 返回可修改 Map |
| directory | 工作目錄 | directory(File) |
| redirectErrorStream | 合併 stderr 到 stdout | redirectErrorStream(boolean) |
| 特性 | Runtime.exec | ProcessBuilder |
|---|---|---|
| 工作目錄控制 | 僅支援單一 File 參數 | directory(File) 靈活設定 |
| 環境變數控制 | 僅能整體替換 | 細粒度 put/remove 修改 |
| 命令參數傳遞 | 字串解析依賴平台 | List 明確分離,跨平台一致 |
| 錯誤流合併 | 不支援 | redirectErrorStream(true) |
| 類別設計 | 靜態工廠方法 | final 類,建構者模式,可重複建構 |
redirectErrorStream(true) 簡化流處理(單一流讀取輸出與錯誤)。proc.waitFor() 等待結束,避免殭屍進程。Java 世紀網 - JDK5 ProcessBuilder 介紹和使用實例