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

Java 與 C# 執行命令列程式對比:以 Ping 為例

     編輯:Java 相關知識

Java 版本

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();
        }
    }
}

C# 版本

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 或 JNICreateNoWindow = true 原生支援
進程銷毀destroy() (SIGTERM)、destroyForcibly() (SIGKILL)Kill()、CloseMainWindow()

最佳實踐建議

  • Java:統一使用 ProcessBuilder,設定 redirectErrorStream(true) 合併錯誤流,搭配 CompletableFuture 非同步讀取。
  • C#:善用 ProcessStartInfo 細粒度屬性,UseShellExecute=false 才能重導向流。
  • 兩者皆需指定編碼(中文環境 Big5/MS950/CP950),否則中文輸出亂碼。
  • 長時間運行進程(如 ping -t)需在別執行緒讀取,主執行緒可定期檢查 isAlive()/HasExited 並決定何時 destroy()/Kill()。

總結

C# Process API 設計更現代、功能更完整(編碼、視窗、非同步事件內建);Java ProcessBuilder 雖功能對等,但需更多樣板碼處理流讀取與編碼。跨平台專案建議將外部程式呼叫封裝為統一服務層,上層業務邏輯保持語言無關。

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