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

J2SE 5.0 新特性:使用 ProcessBuilder 讀取 Windows 網卡 MAC 位址

     編輯:Java 相關知識

ProcessBuilder 取代 Runtime.exec 的優勢

J2SE 5.0 引入的 ProcessBuilder 類別提供了更靈活的外部程式執行機制,相較於傳統的 Runtime.exec(),它支援環境變數設定、工作目錄指定、輸入輸出流重導向等進階功能。本文示範如何利用此新特性在 Windows 環境下擷取網卡實體位址(MAC Address)。

核心實作程式碼

package com.kuaff.jdk5package;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class ProcessBuilderShow {
    public static List<String> getPhysicalAddress() {
        Process p = null;
        List<String> address = new ArrayList<String>();

        try {
            // 執行 ipconfig /all 取得完整網路設定
            p = new ProcessBuilder("ipconfig", "/all").start();
        } catch (IOException e) {
            return address; // 發生例外回傳空列表
        }

        byte[] buffer = new byte[1024];
        StringBuffer output = new StringBuffer();
        InputStream in = p.getInputStream();

        try {
            int bytesRead;
            while ((bytesRead = in.read(buffer)) > 0) {
                output.append(new String(buffer, 0, bytesRead));
            }
        } catch (IOException e1) {
            // 忽略讀取錯誤
        } finally {
            try { in.close(); } catch (IOException e2) {}
        }

        // 解析輸出文字擷取 MAC 位址
        String result = output.toString();
        String keyword = "Physical Address. . . . . . . . . :";
        int index = result.indexOf(keyword);
        
        while (index > 0) {
            result = result.substring(index + keyword.length());
            // MAC 位址格式為 XX-XX-XX-XX-XX-XX(17 字元含連字號)
            address.add(result.substring(0, 17).trim());
            index = result.indexOf(keyword);
        }
        return address;
    }

    public static void main(String[] args) {
        List<String> addresses = ProcessBuilderShow.getPhysicalAddress();
        for (String addr : addresses) {
            System.out.printf("實體網卡位址: %s%n", addr);
        }
    }
}

關鍵技術要點解析

  • ProcessBuilder 建構式:接受可變長度字串陣列或 List<String> 作為指令與參數,避免字串分割的空白字元問題
  • 輸出流處理:必須完整讀取 getInputStream() 避免緩衝區滿導致子程式掛起
  • 字元編碼考量:Windows 中文環境下 ipconfig 輸出為 Big5/CP950 編碼,實際專案應指定 new String(buffer, 0, bytesRead, "MS950")
  • 跨平台相容性:Linux/Unix 系統應改用 ifconfig 或 ip link 指令,關鍵字對應修改為 "ether" 或 "HWaddr"

進階應用與改進方向

  1. 錯誤流處理:同步讀取 getErrorStream() 避免死結,或使用 redirectErrorStream(true) 合併標準錯誤輸出
  2. 正則表達式解析:使用 Pattern.compile("([0-9A-F]{2}[:-]){5}[0-9A-F]{2}") 更健壯地提取 MAC 位址
  3. 網卡過濾:結合 "Description" 或 "DHCP Enabled" 欄位過濾虛擬網卡、隧道介面
  4. 非同步處理:搭配 CompletableFuture 實作非阻塞式網路資訊收集

常見應用場景

  • 軟體授權綁定特定硬體裝置
  • 網路存取控制(NAC)客戶端身分識別
  • 資產管理系統自動掃描硬體資訊
  • 多網卡伺服器介面識別與綁定

ProcessBuilder 作為 Java 5 引入的重要改進,不僅解決了 Runtime.exec 的諸多限制,更為系統整合開發提供了標準化、可擴展的外部程式呼叫框架。掌握其用法對於開發跨平台系統管理工具具有重要價值。

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