方法一:
import java.net.InetAddress;
import java.io.InputStream;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.StringTokenizer;
public final class NetworkInfo {
private final static String getMacAddress() throws IOException {
String os = System.getProperty("os.name");
try {
if (os.startsWith("Windows")) {
return windowsParseMacAddress(windowsRunIpConfigCommand());
} else if (os.startsWith("Linux")) {
return linuxParseMacAddress(linuxRunIfConfigCommand());
} else {
throw new IOException("unknown operating system:" + os);
}
} catch (ParseException ex) {
ex.printStackTrace();
throw new IOException(ex.getMessage());
}
}
/*
* Linux stuff
*/
private final static String linuxParseMacAddress(String ipConfigResponse) throws ParseException {
String localHost = null;
try {
localHost = InetAddress.getLocalHost().getHostAddress();
} catch (java.net.UnknownHostException ex) {
ex.printStackTrace();
throw new ParseException(ex.getMessage(), 0);
}
StringTokenizer tokenizer = new StringTokenizer(ipConfigResponse, "\n");
String lastMacAddress = null;
while (tokenizer.hasMoreTokens()) {
String line = tokenizer.nextToken().trim();
boolean containsLocalHost = line.indexOf(localHost) >= 0;
// see if line contains IP address
if (containsLocalHost && lastMacAddress != null) {
return lastMacAddress;
}
// see if line contains MAC address
int macAddressPosition = line.indexOf("HWaddr");
if (macAddressPosition <= 0)
continue;
String macAddressCandidate = line.substring(macAddressPosition + 6).trim();
if (linuxIsMacAddress(macAddressCandidate)) {
lastMacAddress = macAddressCandidate;
continue;
}
}
ParseException ex = new ParseException("cannot read MAC address for " + localHost
+ " from [" + ipConfigResponse + "]", 0);
ex.printStackTrace();
throw ex;
}
private final static boolean linuxIsMacAddress(String macAddressCandidate) {
if (macAddressCandidate.length() != 17){
return false;
}
return true;
}
private final static String linuxRunIfConfigCommand() throws IOException {
Process p = Runtime.getRuntime().exec("ifconfig");
InputStream stdoutStream = new BufferedInputStream(p.getInputStream());
StringBuffer buffer = new StringBuffer();
for (;;) {
int c = stdoutStream.read();
if (c == -1)
break;
buffer.append((char) c);
}
String outputText = buffer.toString();
stdoutStream.close();
return outputText;
}
/*
* Windows stuff
*/
private final static String windowsParseMacAddress(String ipConfigResponse)
throws ParseException {
String localHost = null;
try {
localHost = InetAddress.getLocalHost().getHostAddress();
} catch (java.net.UnknownHostException ex) {
ex.printStackTrace();
throw new ParseException(ex.getMessage(), 0);
}
StringTokenizer tokenizer = new StringTokenizer(ipConfigResponse, "\n");
String lastMacAddress = null;
while (tokenizer.hasMoreTokens()) {
String line = tokenizer.nextToken().trim();
// see if line contains IP address
if (line.endsWith(localHost) && lastMacAddress != null) {
return lastMacAddress;
}
// see if line contains MAC address
int macAddressPosition = line.indexOf(":");
if (macAddressPosition <= 0)
continue;
String macAddressCandidate = line.substring(macAddressPosition + 1).trim();
if (windowsIsMacAddress(macAddressCandidate)) {
lastMacAddress = macAddressCandidate;
continue;
}
}
ParseException ex = new ParseException("cannot read MAC address from ["
+ ipConfigResponse + "]", 0);
ex.printStackTrace();
throw ex;
}
private final static boolean windowsIsMacAddress(String macAddressCandidate) {
if (macAddressCandidate.length() != 17){
return false;
}
return true;
}
private final static String windowsRunIpConfigCommand() throws IOException {
Process p = Runtime.getRuntime().exec("ipconfig /all ");
InputStream stdoutStream = new BufferedInputStream(p.getInputStream());
StringBuffer buffer = new StringBuffer();
for (;;) {
int c = stdoutStream.read();
if (c == -1)
break;
buffer.append((char) c);
}
String outputText = buffer.toString();
stdoutStream.close();
return outputText;
}
/*
* Main
*/
public final static void main(String[] args) {
try {
System.out.println("Network infos");
System.out.println("Operating System:" + System.getProperty("os.name"));
System.out.println("IP/Localhost:" + InetAddress.getLocalHost().getHostAddress());
System.out.println("MAC Address:" + getMacAddress());
} catch (Throwable t) {
t.printStackTrace();
}
}
}
方法二:
在Unix/Linux 下通常只有root 用户才有执行ifconfig 命令的权限, 第一种方法中用调用ifconfig 命令的方法获取硬件地址可靠性不好, 普通用户无法正确获取硬件地址,该方法通过纯java的方式很好地解决了此问题
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class MyMac {
public static void main(String[] args) {
try {
//枚举所有网络接口设备
Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
//循环处理每一个网络接口设备
while (interfaces.hasMoreElements()) {
NetworkInterface face = (NetworkInterface) interfaces.nextElement();
//环回设备(lo)设备不处理
if (!face.getName().equals("lo")) {
//显示当前网络接口设备显示名称
System.out.println("网卡显示名称:" + face.getDisplayName());
//显示当前设备内部名称
System.out.println(" 网卡设备名称:" + face.getName());
// 获取硬件地址
byte[] mac = face.getHardwareAddress();
System.out.println(" 硬件地址(MAC):" + bytes2mac(mac));
}
}
} catch (SocketException se) {
System.err.println("错误:" + se.getMessage());
}
}
private static String bytes2mac(byte[] bytes) {
//MAC 地址应为6 字节
if (bytes.length != 6) {
System.err.println("MAC 地址数据有错! ");
return null;
}
StringBuffer macString = new StringBuffer();
byte currentByte;
for (int i = 0; i < bytes.length; i++) {
//与11110000 作按位与运算以便读取当前字节高4 位
currentByte = (byte) ((bytes[i] & 240) >> 4);
macString.append(Integer.toHexString(currentByte));
//与00001111 作按位与运算以便读取当前字节低4 位
currentByte = (byte) ((bytes[i] & 15));
macString.append(Integer.toHexString(currentByte));
//追加字节分隔符“-”
macString.append("-");
}
//删除多加的一个“-”
macString.delete(macString.length() - 1, macString.length());
//统一转换成大写形式后返回
return macString.toString().toUpperCase();
}
}
分享到:
相关推荐
《Java与模式 阎宏 摘录》是一本深度探讨Java编程语言与设计模式的书籍,由著名IT专家阎宏所著。这本书旨在帮助Java开发者深入理解面向对象设计原则,掌握并应用各种设计模式,提升软件开发的效率和质量。通过摘录,...
标题为《2020年最新Java核心知识点整理》,描述为对Java基础到进阶的全部学习资料进行整理,这些内容旨在提供给Java学习者,帮助他们系统性地掌握Java编程。文件还特别提到了JVM(Java虚拟机)以及GC(垃圾回收)等...
传播学原理知识点个人从老师PPT上摘录整理.doc
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
本人根据自己学习的经验,将JAVA SE阶段的大部分重点知识摘录出来,放在Xmind思维导图中。希望可以对新人起到帮助效果
**Google Datastore for Java 文档摘录(四)** 在这一部分,我们将深入探讨Google Datastore,这是一个在Java环境中使用的云数据库服务。Google Datastore是一个NoSQL文档数据库,提供了高可用性和可扩展性,适用...
- 阅读.pdf:可能包含技术文章、论文或书籍摘录,帮助深入理解和掌握Java及相关技术。 - 艺术.pdf:虽然看似不直接相关,但设计原则和用户体验在软件开发中也很重要。 - 关注科帮网获取更多源码.url:这是一个网址...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录质
《Google Datastore for Java 文档摘录(一)》 Google Datastore 是 Google 提供的一种分布式、高可扩展性、持久化的数据存储服务,它属于 Google Cloud Platform (GCP) 的一部分。对于 Java 开发者而言,Google ...
Java IO流思维导图,主要摘录整理的是java.io.*包下的所有IO对象,其中对应备注里包含各个IO对象的构造方法
ACE,全称Adaptive Communication Environment,是一个强大的C++跨平台框架工具,专为通信软件的开发设计。它包含了丰富的组件,旨在提升并发性、效率、可靠性和可移植性。ACE的核心功能包括进程间通信(IPC)、...
根据提供的文件信息,我们可以从中提炼出关于Java Servlet API Specification的相关知识点。下面将详细介绍这些知识点。 ### Java Servlet API Specification概述 #### 版本信息 - **版本号:** 2.4 - **状态:** ...
在Java语言规范中,提到了var关键字的使用,这是在Java 10中引入的一个新的本地变量类型推断特性,也在Java 11中得到支持。该关键字允许编译器根据初始化表达式推断变量的类型,使代码更加简洁。 文档中提及了不同...
针对要面试java的兴趣者,一些比较经典的问题来的!
- **定义**:利用Java的类加载机制来实现单例模式。 - **实现**:将单例对象放在静态内部类中,只有当外部类的方法被调用时才会加载内部类,从而创建实例。 - **特点**:线程安全,支持延迟加载,且无需使用`...
数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的...
### 《Think-in-JAVA-4th-Edition》核心知识点概览 #### 一、书籍简介 《Thinking in Java》是一本由Bruce Eckel撰写的经典Java编程书籍,被誉为是学习Java的最佳参考资料之一。该书适合具有一定Java基础的学习者...
### Thinking in Java 高清版知识点总结 #### 一、书籍概述 《Thinking in Java》是一本由Bruce Eckel撰写的经典Java编程书籍。本书旨在为读者提供从基础到高级的全面Java编程知识体系,适合从初学者到具有一定...