前言

有时我们因为软件授权或者其它需要获取主机唯一标识而需要获取用户主机的MAC地址,而本文则将介绍如何通过Java来实现跨平台获取MAC地址的两种方法,同时具体的代码也已上传到GitHub。

如果不希望将 GitHub 的代码克隆到本地查看,但是又无法忍受在网页查看代码时无限的链接嵌套,可以尝试在网址的 GitHub 单词后加上 1s,即可在网页中有通过 VSCode 查看代码的效果,例如本文是 https://github1s.com/zhangjiwei1221/blog/blob/master/mac,如下图所示:

使用 NetworkInterface 类

首先介绍如何通过JavaNetworkInterface类的API来获取本机MAC地址的方法,首先展示代码:

/*** 获取 mac 地址工具类 v1 版** @date 2021/5/13* @author zjw*/
public class MacUtil {public static void main(String[] args) {getMac().forEach(System.out::println);}/*** 获取本机 mac 地址集合** @return mac 地址集合*/public static List<String> getMac() {List<String> list = new ArrayList<>();try {Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();while (networkInterfaces.hasMoreElements()) {NetworkInterface networkInterface = networkInterfaces.nextElement();Optional.ofNullable(networkInterface.getHardwareAddress()).ifPresent(mac -> list.add(format(mac)));}} catch (Exception e) {e.printStackTrace();}return list;}/*** 将 mac 字节数组格式化为全大写并且使用 - 作为分隔符的字符串** @param mac 获取到的 mac 字节数组** @return 格式化后的 mac 地址*/private static String format(byte[] mac) {StringBuilder sb = new StringBuilder();for (byte b : mac) {sb.append(String.format("%02X", b)).append("-");}sb.deleteCharAt(sb.length() - 1);return sb.toString();}}

通过以上代码理论上即可获取本机所有的MAC地址,此外通过format方法可以将获取到的MAC地址统一处理成XX-XX-XX-XX-XX-XX的格式,这里之所以说是理论上,是因为我曾经在别人的苹果电脑上运行,结果并没有得到所有MAC地址(没有得到执行ifconfig -a得到的所有MAC地址,而且还会出现llw0这个网络的MAC地址一直变动),但是我在本地的虚拟机中运行苹果时却也是正常,由于我自己没有苹果电脑,所以暂时也不清楚具体的原因,如果有知道的小伙伴,欢迎留言,提前感谢啦~~~

执行命令行获取

正如在上一部分中提到的,在某些情况下使用NetworkInterface类并不能获取到本机所有的MAC地址,甚至还可能出现动态变化的情况(暂时不清楚原因)。因此,在这种情况下只能通过JavaRuntime类的exec方法直接执行命令了,当然在大多数情况下还是建议使用NetworkInterface类,不仅方便,而且万一以后修复了上面的bug(不知道算不算是bug,还是我个人的问题),不对上述代码做任何变动就可以得到自己执行命令的效果了,说了那么多,先看看如果通过自己执行命令获取本机的所有MAC地址吧,先直接展示代码:

/*** 获取 mac 地址工具类 v2 版** @date 2021/5/13* @author zjw*/
public class MacUtil {private static final String WIN_PREFIX = "win";private static final String OS_NAME_PROPERTY = "os.name";private static final String WIN_COMMAND = "ipconfig /all";private static final String UNIX_COMMAND = "/sbin/ifconfig -a";private static final String MAC_REGEX = "(([a-f0-9]{2}-){5}|([a-f0-9]{2}:){5})[a-f0-9]{2}";private static final Pattern pattern = Pattern.compile(MAC_REGEX, Pattern.CASE_INSENSITIVE);public static void main(String[] args) {getMac().forEach(System.out::println);}/*** 根据不同操作系统执行不同命令* 获取本机 mac 地址集合** @return mac 地址集合*/private static List<String> getMac() {try {String osName = System.getProperty(OS_NAME_PROPERTY).toLowerCase();if (osName.startsWith(WIN_PREFIX)) {return getMacByCommand(WIN_COMMAND);}return getMacByCommand(UNIX_COMMAND);} catch (Exception e) {e.printStackTrace();}return Collections.emptyList();}/*** 通过正则表达式提取执行命令得到的结果集中的 mac 地址* 并调整得到的 mac 地址的格式** @param command 查看网络信息的命令** @return mac 地址集合*/private static List<String> getMacByCommand(String command) throws IOException {List<String> macList = new ArrayList<>();List<String> strList = execCommand(command);for (String str : strList) {Matcher matcher = pattern.matcher(str);if (matcher.find() && matcher.end() == str.length()) {macList.add(matcher.group().replace(":", "-").toUpperCase());}}return macList;}/*** 执行命令并得到结果的每一行组成的字符串数组** @param command 查看网络信息的命令** @return 执行命令返回的所有数据行*/private static List<String> execCommand(String command) throws IOException {List<String> strList = new ArrayList<>();Process process = Runtime.getRuntime().exec(command);try (BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()))) {return br.lines().collect(Collectors.toList());} catch (Exception e) {e.printStackTrace();}process.destroy();return strList;}}

以上便是通过执行命令并结合正则表达式获取本机所有MAC地址的方法,代码如有错误不当之处,欢迎留言指正。

总结

本文简单介绍了两种跨平台获取MAC地址的方法,不过仍然存在一些尚未解决的问题,希望有了解的朋友能够留言告诉我,感激不尽!

参考资料

洪勇军.Java实现跨平台的MAC地址读取[J].电脑编程技巧与维护,2009(17):52-53.

Java 跨平台获取 MAC 地址的两种方法相关推荐

  1. Android手机获取IP地址的两种方法

    Android手机获取IP地址的两种方法 本文章讲解了WIFI和GPRS两种情况下获取手机IP地址的方法 1.使用WIFI 1,首先设置用户权限 AndroidManifest.xml添加: < ...

  2. android 取mac地址,Android手机获取Mac地址的几种方法,androidmac

    Android手机获取Mac地址的几种方法,androidmac 最常用的方法,通过WiFiManager获取: /** * 通过WiFiManager获取mac地址 * @param context ...

  3. 获取MAC地址的四种方法(转)

    https://www.cnblogs.com/zlshmily/p/10058560.html zlshmily 在实际的应用系统中,我们往往会需要在程序运行时获取当前机器的网卡的MAC地址,以便作 ...

  4. Android设备用指令查看设备mac地址的两种方法

    Android设备可以用如下两种方法查看设备网络信息 1. ifconfig指令 inet addr 是ip地址 HWaddr 是mac地址 wlan0是wifi的mac地址 eth0是设备第一个以太 ...

  5. android 手机固定mac地址吗,Android手机获取Mac地址的几种方法

    最常用的方法,通过WiFiManager获取: /** * 通过WiFiManager获取mac地址 * @param context * @return */ private static Stri ...

  6. android 4g获取mac地址,Android手机获取Mac地址的几种方法

    最常用的方法,通过WiFiManager获取: /** * 通过WiFiManager获取mac地址 * @param context * @return */ private static Stri ...

  7. [机器码] 获取 MAC 地址的几种方法

    Netbios #include <windows.h> #pragma comment(lib, "Netapi32.lib")namespace {bool Get ...

  8. 记Java如何获取MAC地址

    MAC地址简单认识 MAC地址也叫物理地址.硬件地址,由网络设备制造商生产时烧录在网卡(Network lnterface Card)的EPROM(一种闪存芯片,通常可以通过程序擦写). IP地址与M ...

  9. Android获取IP地址的两种方式(准确版)

    原文:https://blog.csdn.net/sinat_16458039/article/details/50260589 最近看了好多网上获取IP地址的例子,发现好多都不完全准确,这里我写一下 ...

最新文章

  1. linux中怎么退出执行过程,(进程)处理过程中的Linux:从执行到退出
  2. 就很突然,电脑里多出了一个文件......
  3. You should rebuild using libgmp = 5 to avoid timing attack vulnerability.
  4. 用WinEdt打开.tex文件显示error reading错误
  5. php中调行高代码_单元格行高怎么设置
  6. 光伏电站清扫机器人_轻型光伏电站清扫机器人的制作方法
  7. 互联网晚报 | 12月22日 星期三 | 乐视宣布涨薪;小米12系列官宣12月28日发布;好未来推出全新品牌美校...
  8. eclipse导出doc文档
  9. native react 更新机制_React Native - 组件的生命周期详解(附:各阶段调用的方法)...
  10. 【JavaScript】重温Javascript继承机制
  11. POJ3750 小孩报数问题【模拟】
  12. ICPC程序设计题解书籍系列之一:刘汝佳:《算法竞赛入门经典》(第2版)
  13. .NET framework 4.0 安装失败的解决方案
  14. windows系统查看局域网内所有已使用的IP
  15. 利用python爬虫进行彼岸网图库图片的抓取(bs4)
  16. win10无限重启服务器,Win10 1909系统解决电脑无限重启的方法
  17. 浏览器存储cookie
  18. Vue路由SPA介绍
  19. ios点击推送闪退_苹果ios企业签名常见问题及解决方案总结,开发者必看!
  20. 用ajax进行分页查询

热门文章

  1. 计算机在艺术娱乐的应用,计算机技术在艺术领域的应用
  2. b64_c3VuJTIwYm95 好看的电影推荐
  3. Unity 之 ShaderGraph 实现自发光和能量护盾效果入门级教程
  4. 防近视护眼台灯哪个牌子好?无蓝光无频闪的护眼台灯推荐
  5. python ABCD 选项蒙题游戏
  6. JAVA简易贪吃蛇游戏实现
  7. 【配电网】基于遗传算法实现三相单目标配电网重构附matlab代码
  8. adb命令行打开Android settings
  9. 公司庆典活动策划方案怎么写?需要把握6个方面
  10. cad批量打印快捷键_原来CAD还能这么打印?批量打印了解一下?1分钟打印100张...