常見錯誤
String cmd = "cmd Java JJ2KDecoder ..."; // 錯誤:缺少 /c 或 /k,路徑含空格未加引號
Runtime.getRuntime().exec(cmd);
正確姿勢
方式一:Runtime.exec(String[])(推薦)
String[] cmd = {
"cmd.exe", "/c",
"java", "JJ2KDecoder",
"-i", "C:\\Users\\Administrator\\Desktop\\JAVA_JPEG2000\\bin_output6.j2c",
"-o", "C:\\Users\\Administrator\\Desktop\\JAVA_JPEG2000\\1.jpg",
"-rate", "1"
};
Process p = Runtime.getRuntime().exec(cmd);
// 必須讀取輸出流,否則進程阻塞
new Thread(() -> {
try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line; while ((line = br.readLine()) != null) System.out.println(line);
} catch (IOException e) { e.printStackTrace(); }
}).start();
p.waitFor();
方式二:ProcessBuilder(更靈活)
ProcessBuilder pb = new ProcessBuilder(
"cmd.exe", "/c", "java", "JJ2KDecoder", ...);
pb.directory(new File("C:\\Path\\To\\WorkingDir")); // 設置工作目錄
pb.redirectErrorStream(true); // 合併錯誤流到輸出流
Process p = pb.start();
// 同樣需異步讀取流
關鍵點總結
- 使用
cmd.exe /c 執行命令並退出,或 /k 保留窗口調試。
- 參數分離傳遞,避免字符串解析歧義(空格、引號、轉義)。
- 必須 異步讀取
getInputStream() 和 getErrorStream(),否則管道填滿導致進程掛起。
- 指定完整類路徑或確保
java 在系統 PATH 中,JJ2KDecoder 類在 classpath 下。