详解Java如何跨平台获取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;
    }

}

源码

到此这篇关于详解Java如何跨平台获取MAC地址的文章就介绍到这了,更多相关Java跨平台获取MAC地址内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java 获取本机的IP与MAC地址实现详解

     Java 获取本机的IP与MAC地址 有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces(); byte[] mac = null; while (allNetInterfaces.ha

  • java通过ip获取客户端Mac地址的小例子

    复制代码 代码如下: package com.yswc.dao.sign; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.regex.Matcher; import java.util.regex.Pattern; /** *  * 获取MAC地址 *  * @author *  * 2011-12 *  */ public class GetMacAddress { publi

  • java编程实现获取服务器IP地址及MAC地址的方法

    本文实例讲述了java编程实现获取服务器IP地址及MAC地址的方法.分享给大家供大家参考,具体如下: 已测系统: windows linux unix 排除127.0.0.1 和 0.0.0.0.1等非正常IP import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; import java.util.Enu

  • java 获取用户的MAC地址多种方法实例详解

    java实现获取用户的MAC地址方法: 方法一:将本机地址与局域网内其他机器区分开来 /** * 根据IP地址获取mac地址 * @param ipAddress 127.0.0.1 * @return * @throws SocketException * @throws UnknownHostException */ public static String getLocalMac(String ipAddress) throws SocketException, UnknownHostEx

  • java 获取mac地址的两种方法(推荐)

    我在网上找了一下获取mac地址的方法,找了两种比较不太一样的方法. 第一种 public static void main(String[] args) throws Exception { InetAddress ia = InetAddress.getLocalHost(); System.out.println(getMACAddress(ia)); } private static String getMACAddress(InetAddress ia) throws Exception

  • Java获取mac地址的方法

    本文实例讲述了Java获取mac地址的方法.分享给大家供大家参考.具体如下: /* * GetMacAddress .java * * description:get Mac addreess * * @author hadeslee * * Created on 2007-9-27, 9:11:15 * * To change this template, choose Tools | Templates * and open the template in the editor. */ pa

  • JAVA如何获取客户端IP地址和MAC地址

    本文介绍了JAVA如何获取客户端IP地址和MAC地址 ,分享给大家,具体如下: 1.获取客户端IP地址 public String getIp(HttpServletRequest request) throws Exception { String ip = request.getHeader("X-Forwarded-For"); if (ip != null) { if (!ip.isEmpty() && !"unKnown".equalsIg

  • JAVA获取本地MAC地址的方法

    InetAddress对象 此类表示Internet协议(IP)地址. IP地址是由IP使用的32位或128位无符号数字,构建UDP和TCP协议的低级协议. IP地址结构由定义RFC 790: Assigned Numbers , RFC 1918: Address Allocation for Private Internets , RFC 2365: Administratively Scoped IP Multicast和RFC 2373: IP Version 6 Addressing

  • java实现获取用户的MAC地址

    方法一:将本机地址与局域网内其他机器区分开来 /** * 根据IP地址获取mac地址 * @param ipAddress 127.0.0.1 * @return * @throws SocketException * @throws UnknownHostException */ public static String getLocalMac(String ipAddress) throws SocketException, UnknownHostException { // TODO Au

  • java根据本地IP获取mac地址的方法

    本文实例为大家分享了java根据本地IP获取mac地址的具体代码,供大家参考,具体内容如下 import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; public class MacAddress { /** * @param args * @throws UnknownHostExcep

  • Java编程实现遍历两个MAC地址之间所有MAC的方法

    本文实例讲述了Java编程实现遍历两个MAC地址之间所有MAC的方法.分享给大家供大家参考,具体如下: 在对发放的设备进行后台管理时,很多时候会用到设备MAC这个字段,它可以标识唯一一个设备.然而在数据库批量的存储MAC地址时,如果使用解析文本逐行添加的方式,难免会显得操作复杂,而且事先还需生成MAC地址文本.事实上MAC地址是按照十六进制逐一递增的,所以只需要给出一个区间便有可能枚举出所有MAC地址.以下是笔者封装的一个通过两个MAC地址枚举区间内所有MAC的函数. /** 输出两个MAC区间

随机推荐