對比 Runtime.exec(),ProcessBuilder 提供:
environment() 返回可修改 Map)directory(File))redirectInput/Output/Error)ProcessBuilder pb = new ProcessBuilder("ipconfig", "/all"); // Windows
// ProcessBuilder pb = new ProcessBuilder("ifconfig", "-a"); // Linux/Mac
pb.directory(new File("C:/work")); // 設置工作目錄
Map env = pb.environment(); // 獲取環境變量副本
env.put("MY_VAR", "value"); // 修改環境變量
Process process = pb.start(); // 啟動進程
package com.kuaff.jdk5package;
import java.io.*;
import java.util.*;
public class ProcessBuilderShow {
public static List getPhysicalAddress() {
List address = new ArrayList<>();
Process p;
try {
p = new ProcessBuilder("ipconfig", "/all").start();
} catch (IOException e) {
return address;
}
// 讀取進程輸出
StringBuilder sb = new StringBuilder();
try (InputStream in = p.getInputStream()) {
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
sb.append(new String(buf, 0, len));
}
} catch (IOException ignored) {}
// 解析輸出提取 MAC
String output = sb.toString();
String keyword = "Physical Address. . . . . . . . . :";
int idx = output.indexOf(keyword);
while (idx > 0) {
output = output.substring(idx + keyword.length());
String mac = output.substring(0, 17).trim(); // 格式: XX-XX-XX-XX-XX-XX
if (mac.matches("([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}")) {
address.add(mac);
}
idx = output.indexOf(keyword);
}
return address;
}
public static void main(String[] args) {
for (String mac : getPhysicalAddress()) {
System.out.printf("物理網卡地址: %s%n", mac);
}
}
}
new ProcessBuilder("ipconfig", "/all") 避免空格/引號轉義問題try-with-resources (Java 7+) 或標準循環確保流關閉new String(buf, 0, len, "GBK")ifconfig/ip link,Mac 用 ifconfig,解析邏輯需適配// 異步讀取輸出,避免緩衝區填滿導致進程阻塞
new Thread(() -> {
try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = br.readLine()) != null) { /* 實時處理 */ }
} catch (IOException e) { /* handle */ }
}).start();
// 進程管道:將進程 A 輸出直接作為進程 B 輸入 (Java 9+)
ProcessBuilder pb1 = new ProcessBuilder("cmd", "/c", "dir");
ProcessBuilder pb2 = new ProcessBuilder("findstr", ".java");
List processes = ProcessBuilder.startPipeline(List.of(pb1, pb2));
ProcessBuilder 是 Java 5 引入的進程管理利器,以物件化設計替代字符串拼接,賦予開發者對環境、目錄、流的精細控制。結合流異步讀取與正則解析,可構建健壯的系統集成工具(如許可證檢測、硬件指纹採集、外部引擎調用)。