获取MAC地址首先要理解当前的操作系统,由于在不同的操作系统中CMD命令所在的位置不同,因此首先使用System类中的getProperty("os.name")方法获取当前的操作系统,getProperty()方法可以确定当前系统属性,它的参数是一些固定的键值。
键 | 相关值的描述 |
---|
java.version | Java 运行时环境版本 |
java.vendor | Java 运行时环境供应商 |
java.vendor.url | Java 供应商的 URL |
java.home | Java 安装目录 |
java.vm.specification.version | Java 虚拟机规范版本 |
java.vm.specification.vendor | Java 虚拟机规范供应商 |
java.vm.specification.name | Java 虚拟机规范名称 |
java.vm.version | Java 虚拟机实现版本 |
java.vm.vendor | Java 虚拟机实现供应商 |
java.vm.name | Java 虚拟机实现名称 |
java.specification.version | Java 运行时环境规范版本 |
java.specification.vendor | Java 运行时环境规范供应商 |
java.specification.name | Java 运行时环境规范名称 |
java.class.version | Java 类格式版本号 |
java.class.path | Java 类路径 |
java.library.path | 加载库时搜索的路径列表 |
java.io.tmpdir | 默认的临时文件路径 |
java.compiler | 要使用的 JIT 编译器的名称 |
java.ext.dirs | 一个或多个扩展目录的路径 |
os.name | 操作系统的名称 |
os.arch | 操作系统的架构 |
os.version | 操作系统的版本 |
file.separator | 文件分隔符(在 UNIX 系统中是“/”) |
path.separator | 路径分隔符(在 UNIX 系统中是“:”) |
line.separator | 行分隔符(在 UNIX 系统中是“/n”) |
user.name | 用户的账户名称 |
user.home | 用户的主目录 |
user.dir | 用户的当前工作目录 |
在确认了CMD命令的位置之后,使用Runtime类中的exec()方法来执行指定的DOS命令,经放置在InputStream对象中,遍历结果中的每一行,获取带有“Phusical Address”字样的行,将后面的MAC地址返回就可以了。
总结一下,获取计算机MAC地址的总体思路:1.获取当前的操作系统 2.找到当前系统下CMD命令的位置 3.用exec()方法执行指定的DOS命令 4.遍历结果的每一行,获取自己需要的信息。下面是详细的代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class GetMAC {
//声明一个空的构造方法
public GetMAC(){}
//获取计算机MAC地址的方法
public String getMAC(){
String macAddress=null;
//获取操作系统的名称
String osName=System.getProperty("os.name");
System.out.println("操作系统为:"+osName);
//声明获取cmd路径的对象并实例化
StringBuffer systemPathBuff=new StringBuffer("");
if(osName.indexOf("Windows")>-1){
//Windows操作系统的cmd.exe的绝对路径
//append方法:将指定的字符串追加到此字符序列
systemPathBuff.append("c:\\WINDOWS\\system32\\cmd.exe");
//System.out.println("cmd.exe的决定路径:"+systemPathBuff.toString());
}
if(osName.indexOf("NT")>-1){
//NT操作系统的cmd.exe的绝对路径
systemPathBuff.append("c:\\WINDOWS\\command.com");
}
//Process 类提供了执行从进程输入、执行输出到进程、
//等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法
Process pro=null;
try{
//功能:相当于在cmd下面执行dir命令,并得到命令执行完毕后的输出流
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();
//功能:相当于在cmd下执行ipconfig/all命令,并得到命令执行完毕后的输出流
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("这台主机的MAC地址为:"+macAddress);
}
}