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

Java 實戰範例(41):使用 Runtime 執行系統命令

     編輯:Java 相關知識

在 Java 中呼叫作業系統原生指令,是整合外部程式、自動化部署、呼叫腳本的常見需求。java.lang.Runtime 類別提供了 exec() 方法,讓我們能夠啟動子程序並取得其輸出。本範例示範如何安全地執行系統命令並讀取結果。

完整程式碼

import java.io.*;

public class CmdExec {
    /**
     * 建構子:執行系統命令並即時輸出結果
     * @param cmdline 完整命令字串(如 "myprog.bat" 或 "ls -l")
     */
    public CmdExec(String cmdline) {
        try {
            String line;
            // 1. 取得 Runtime 實例並啟動子程序
            Process p = Runtime.getRuntime().exec(cmdline);

            // 2. 使用緩衝讀取器包裝標準輸出流
            BufferedReader input = new BufferedReader(
                new InputStreamReader(p.getInputStream())
            );

            // 3. 逐行讀取並輸出
            while ((line = input.readLine()) != null) {
                System.out.println("java print: " + line);
            }

            // 4. 關閉資源
            input.close();

        } catch (Exception err) {
            err.printStackTrace();
        }
    }

    public static void main(String argv[]) {
        // 執行批次檔(Windows)或 Shell 腳本
        new CmdExec("myprog.bat");
    }
}

關鍵點解析

  1. Runtime.getRuntime().exec():啟動獨立程序,回傳 Process 物件代表子程序。
  2. p.getInputStream():取得子程序的標準輸出(stdout)。注意:若需捕捉錯誤輸出,須另行讀取 p.getErrorStream()。
  3. BufferedReader + InputStreamReader:標準的「位元組轉字元、緩衝讀取」組合,支援逐行讀取。
  4. 資源釋放:finally 區塊關閉串流是良好習慣(範例為簡潔省略,實務請補上)。
  5. 阻塞風險:若子程序輸出大量資料且未及時讀取,可能導致緩衝區滿而阻塞。生產環境建議用獨立執行緒非同步讀取 stdout/stderr。

進階補充(Java 9+ 推薦)

Java 9 引入 ProcessBuilder 並強化 Process API,提供更靈活的參數傳遞、環境變數設定、輸出重導向等功能:

ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "dir");
pb.redirectErrorStream(true); // 合併 stderr 到 stdout
Process p = pb.start();
// 後續讀取邏輯相同

小結

掌握 Runtime.exec() 是 Java 與系統整合的基礎。實務上請注意:非同步讀取雙向串流、設定逾時、處理編碼、防止指令注入。下一篇將介紹 ProcessBuilder 的進階用法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved