详解Java如何跨平台获取MAC地址
使用 NetworkInterface 类
首先介绍如何通过Java
的NetworkInterface
类的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
地址,甚至还可能出现动态变化的情况(暂时不清楚原因)。因此,在这种情况下只能通过Java
的Runtime
类的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; } }
源码
到此这篇关于详解Java如何跨平台获取MAC地址的文章就介绍到这了,更多相关Java跨平台获取MAC地址内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
Java中lombok的@Builder注解的解析与简单使用详解
这篇文章主要介绍了Java中lombok的@Builder注解的解析与简单使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-06Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20- 这篇文章主要介绍了Java线程池中的各个参数如何合理设置操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-19
- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
- 在Java中,我们可以利用多线程来最大化地压榨CPU多核计算的能力,下面这篇文章主要给大家介绍了关于java中多线程与线程池基本使用的相关资料,需要的朋友可以参考下...2021-09-13