在 Windows Server 2008 上調用 WinRAR 壓縮,字符串命令拋異常,而 XP/Win7/2003 正常。
String cmd = "C:/Program Files (x86)/WinRAR/rar.exe a c:/test.rar c:/test.log";
Process proc = Runtime.getRuntime().exec(cmd); // 路徑含空格導致解析失敗
String[] cmd = {
"C:/Program Files (x86)/WinRAR/rar.exe",
"a",
"C:/test.rar",
"c:/test.log"
};
Process proc = Runtime.getRuntime().exec(cmd); // 每個參數獨立,自動處理空格
Runtime.exec(String) 內部使用 StringTokenizer 按空格分割,導致 Program Files 被拆為兩個參數。Runtime.exec(String[]) 直接將數組元素作為 argv 傳給底層 CreateProcess,無需解析,完美支持路徑空格、特殊字符。ProcessBuilder pb = new ProcessBuilder(
"C:/Program Files (x86)/WinRAR/rar.exe", "a", "C:/test.rar", "c:/test.log");
pb.directory(new File("C:/work")); // 設置工作目錄
Map<String, String> env = pb.environment();
env.put("MY_VAR", "value"); // 設置環境變量
Process proc = pb.start();
// 讀取輸出流防止阻塞
try (BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()))) {
String line;
while ((line = br.readLine()) != null) System.out.println(line);
}
int exitCode = proc.waitFor();
String[] 或 ProcessBuilder。getInputStream() 和 getErrorStream(),否則緩衝區滿導致進程掛起。File.separator 或正斜杠 /(Windows 也支持)。ProcessHandle (JDK 9+) 監控。