在 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");
}
}
Process 物件代表子程序。p.getErrorStream()。finally 區塊關閉串流是良好習慣(範例為簡潔省略,實務請補上)。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 的進階用法。