首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 調用命令行壓縮文件:Runtime.exec 參數數組解決路徑空格問題

     編輯:Java 相關知識

問題現象

在 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 更靈活(JDK 5+ 推薦)

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();

最佳實踐清單

  1. 優先使用 String[] 或 ProcessBuilder。
  2. 必須消費 getInputStream() 和 getErrorStream(),否則緩衝區滿導致進程掛起。
  3. 跨平台路徑用 File.separator 或正斜杠 /(Windows 也支持)。
  4. 長時間運行進程考慮異步讀取流或使用 ProcessHandle (JDK 9+) 監控。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved