獲取MAC地址首先要理解當(dāng)前的操作系統(tǒng),由于在不同的操作系統(tǒng)中CMD命令所在的位置不同,因此首先使用System類中的getProperty("os.name")方法獲取當(dāng)前的操作系統(tǒng),getProperty()方法可以確定當(dāng)前系統(tǒng)屬性,它的參數(shù)是一些固定的鍵值。
java.version Java 運(yùn)行時(shí)環(huán)境版本
java.vendor Java 運(yùn)行時(shí)環(huán)境供應(yīng)商
java.vendor.url Java 供應(yīng)商的 URL
java.home Java 安裝目錄
java.vm.specification.version Java 虛擬機(jī)規(guī)范版本
java.vm.specification.vendor Java 虛擬機(jī)規(guī)范供應(yīng)商
java.vm.specification.name Java 虛擬機(jī)規(guī)范名稱
java.vm.version Java 虛擬機(jī)實(shí)現(xiàn)版本
java.vm.vendor Java 虛擬機(jī)實(shí)現(xiàn)供應(yīng)商
java.vm.name Java 虛擬機(jī)實(shí)現(xiàn)名稱
java.specification.version Java 運(yùn)行時(shí)環(huán)境規(guī)范版本
java.specification.vendor Java 運(yùn)行時(shí)環(huán)境規(guī)范供應(yīng)商
java.specification.name Java 運(yùn)行時(shí)環(huán)境規(guī)范名稱
java.class.version Java 類格式版本號(hào)
java.class.path Java 類路徑
java.library.path 加載庫時(shí)搜索的路徑列表
java.io.tmpdir 默認(rèn)的臨時(shí)文件路徑
java.compiler 要使用的 JIT 編譯器的名稱
java.ext.dirs 一個(gè)或多個(gè)擴(kuò)展目錄的路徑
os.name 操作系統(tǒng)的名稱
os.arch 操作系統(tǒng)的架構(gòu)
os.version 操作系統(tǒng)的版本
file.separator 文件分隔符(在 UNIX 系統(tǒng)中是“/”)
path.separator 路徑分隔符(在 UNIX 系統(tǒng)中是“:”)
line.separator 行分隔符(在 UNIX 系統(tǒng)中是“/n”)
user.name 用戶的賬戶名稱
user.home 用戶的主目錄
user.dir 用戶的當(dāng)前工作目錄
在確認(rèn)了CMD命令的位置之后,使用Runtime類中的exec()方法來執(zhí)行指定的DOS命令,經(jīng)放置在InputStream對(duì)象中,遍歷結(jié)果中的每一行,獲取帶有“Phusical Address”字樣的行,將后面的MAC地址返回就可以了。
總結(jié)一下,獲取計(jì)算機(jī)MAC地址的總體思路:1.獲取當(dāng)前的操作系統(tǒng) 2.找到當(dāng)前系統(tǒng)下CMD命令的位置 3.用exec()方法執(zhí)行指定的DOS命令 4.遍歷結(jié)果的每一行,獲取自己需要的信息。下面是詳細(xì)的代碼:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class GetMAC {
//聲明一個(gè)空的構(gòu)造方法
public GetMAC(){}
//獲取計(jì)算機(jī)MAC地址的方法
public String getMAC(){
String macAddress=null;
//獲取操作系統(tǒng)的名稱
String osName=System.getProperty("os.name");
System.out.println("操作系統(tǒng)為:"+osName);
//聲明獲取cmd路徑的對(duì)象并實(shí)例化
StringBuffer systemPathBuff=new StringBuffer("");
if(osName.indexOf("Windows")>-1){
//Windows操作系統(tǒng)的cmd.exe的絕對(duì)路徑
//append方法:將指定的字符串追加到此字符序列
systemPathBuff.append("c:\WINDOWS\system32\cmd.exe");
//System.out.println("cmd.exe的決定路徑:"+systemPathBuff.toString());
} if(osName.indexOf("NT")>-1){
//NT操作系統(tǒng)的cmd.exe的絕對(duì)路徑
systemPathBuff.append("c:\WINDOWS\command.com");
} //Process 類提供了執(zhí)行從進(jìn)程輸入、執(zhí)行輸出到進(jìn)程、
//等待進(jìn)程完成、檢查進(jìn)程的退出狀態(tài)以及銷毀(殺掉)進(jìn)程的方法
Process pro=null;
try{ //功能:相當(dāng)于在cmd下面執(zhí)行dir命令,并得到命令執(zhí)行完畢后的輸出流
pro=Runtime.getRuntime().exec(systemPathBuff.toString()+" /c dir ");
InputStream getMsg=pro.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(getMsg));
//讀取第一行
String message=br.readLine();
// String serNuResult=null;
int index=-1;
//讀取下一行
message=br.readLine();
//功能:相當(dāng)于在cmd下執(zhí)行ipconfig/all命令,并得到命令執(zhí)行完畢后的輸出流
pro=Runtime.getRuntime().exec(systemPathBuff.toString()+" /c ipconfig/all");//必須在/c的前面
//加空格
getMsg=pro.getInputStream();
br=new BufferedReader(new InputStreamReader(getMsg));
//讀取第一行
message=br.readLine();
while(message!=null){
if((index=message.indexOf("Physical Address"))>0){
macAddress=message.substring(index+36).trim();
break;
} //讀取下一行
message=br.readLine();
} }catch(IOException e){
e.printStackTrace();
} return macAddress;
} public static void main(String[] args){
GetMAC macAdd=new GetMAC();
String macAddress=macAdd.getMAC();
System.out.println("這臺(tái)主機(jī)的MAC地址為:"+macAddress);
} }