首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 執行 DOS 命令最佳實踐:路徑解析、參數傳遞與輸出捕獲

     編輯:程式設計綜合問答

常見錯誤

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 下。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved