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

Java Runtime.exec 啟動外部程式:Notepad、Calc 與自定義 EXE 完整範例

     編輯:Java 相關知識

核心 API:Runtime.getRuntime().exec()

Process exec(String command) / Process exec(String[] cmdarray) — 啟動子進程,返回 Process 物件控制輸入/輸出/錯誤流、等待結束、獲取退出碼。

範例 1:啟動系統內建程式


public class LaunchNotepad {
    public static void main(String[] args) {
        Runtime rt = Runtime.getRuntime();
        try {
            // Windows 系統路徑已在 PATH 中,可直接用命令名
            Process p = rt.exec("notepad.exe");
            // 可選:等待結束 int exit = p.waitFor();
        } catch (Exception e) {
            System.err.println("啟動失敗: " + e.getMessage());
        }
    }
}

範例 2:啟動自定義路徑 EXE(含空格處理)


public class LaunchCustomExe {
    public static void main(String[] args) {
        Runtime rt = Runtime.getRuntime();
        try {
            // 路徑含空格時,需用雙引號包裹;Java 字串中雙引號需轉義 \"
            String cmd = "\"D:/Program Files/MyApp/MyApp.exe\"";
            // 或使用 String[] 避免引號轉義麻煩
            // String[] cmdArr = {"D:/Program Files/MyApp/MyApp.exe", "arg1", "arg2"};
            Process p = rt.exec(cmd);
        } catch (Exception e) {
            System.err.println("啟動失敗: " + e.getMessage());
        }
    }
}

進階:處理子進程流(避免阻塞/死鎖)


Process p = rt.exec("some_command");
// 必須在單獨執行緒消費 stdout/stderr,否則緩衝區滿導致子進程掛起
new Thread(() -> {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
        String line;
        while ((line = br.readLine()) != null) System.out.println("[OUT] " + line);
    } catch (IOException ignored) {}
}).start();
new Thread(() -> {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()))) {
        String line;
        while ((line = br.readLine()) != null) System.err.println("[ERR] " + line);
    } catch (IOException ignored) {}
}).start();
int exitCode = p.waitFor(); // 等待結束

現代替代:ProcessBuilder(Java 1.5+)


ProcessBuilder pb = new ProcessBuilder("D:/MyApp/MyApp.exe", "arg1", "arg2");
pb.directory(new File("D:/MyApp"));        // 設定工作目錄
pb.environment().put("MY_VAR", "value");   // 設定環境變數
pb.redirectErrorStream(true);              // 合併 stderr 到 stdout
Process p = pb.start();
// 後續流處理同上

ProcessBuilder API 更豐富、靈活,新專案優先使用。

常見坑點提示

  • **未消費流導致死鎖**:子進程輸出超過管道緩衝區(通常 4KB-64KB)即阻塞。
  • **路徑空格/特殊字符**:用 String[] 或正確轉義引號。
  • **工作目錄錯誤**:相對路徑依賴工作目錄,顯式設定 pb.directory()。
  • **權限不足**:EXE 需執行權限;Windows 需管理員權限時需 UAC 提升(Java 無法直接提升,需外部 Manifest 或 scheduled task)。
  • **跨平台**:Windows 用 .exe/.bat,Linux/Mac 用腳本/二進制,路徑分隔符不同。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved