import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class TestProcess {
public static void main(String[] args) {
try {
// Windows 下需用 cmd /c 執行內建命令
Process p = Runtime.getRuntime().exec("cmd /c ping 127.0.0.1 -t");
// 或直接 exec("ping 127.0.0.1 -t") 視 OS 而定
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(p.getInputStream(), "MS950"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
p.waitFor();
p.destroy();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
namespace ConsoleApplication1 {
class TestProcess {
public static void ExecuteCommand() {
var start = new ProcessStartInfo("ping.exe") {
Arguments = "127.0.0.1 -t",
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
StandardOutputEncoding = Encoding.GetEncoding(950),
StandardErrorEncoding = Encoding.GetEncoding(950)
};
using (var p = Process.Start(start)) {
string line;
while ((line = p.StandardOutput.ReadLine()) != null) {
Console.WriteLine(line);
}
p.WaitForExit();
}
}
}
}
| 特性 | Java (Runtime.exec / ProcessBuilder) | C# (Process.Start) |
|---|---|---|
| API 風格 | 舊版 Runtime.exec、新版 ProcessBuilder(推薦) | ProcessStartInfo + Process.Start,物件導向更豐富 |
| 參數傳遞 | 單一字串或字串陣列,需自行處理引號轉義 | Arguments 屬性自動處理空白與引號 |
| 編碼指定 | InputStreamReader(stream, charset) | StandardOutputEncoding / StandardErrorEncoding |
| 非同步讀取 | 需自行開執行緒讀取 InputStream/ErrorStream | 事件式 OutputDataReceived/ErrorDataReceived 或 ReadToEndAsync |
| 隱藏視窗 | Windows 需 cmd /c start /min 或 JNI | CreateNoWindow = true 原生支援 |
| 進程銷毀 | destroy() (SIGTERM)、destroyForcibly() (SIGKILL) | Kill()、CloseMainWindow() |
ProcessBuilder,設定 redirectErrorStream(true) 合併錯誤流,搭配 CompletableFuture 非同步讀取。ProcessStartInfo 細粒度屬性,UseShellExecute=false 才能重導向流。ping -t)需在別執行緒讀取,主執行緒可定期檢查 isAlive()/HasExited 並決定何時 destroy()/Kill()。C# Process API 設計更現代、功能更完整(編碼、視窗、非同步事件內建);Java ProcessBuilder 雖功能對等,但需更多樣板碼處理流讀取與編碼。跨平台專案建議將外部程式呼叫封裝為統一服務層,上層業務邏輯保持語言無關。