詳解Java如何跨平臺(tái)獲取MAC地址
使用 NetworkInterface 類(lèi)
首先介紹如何通過(guò)Java
的NetworkInterface
類(lèi)的API
來(lái)獲取本機(jī)MAC
地址的方法,首先展示代碼:
/** * 獲取 mac 地址工具類(lèi) v1 版 * * @date 2021/5/13 * @author zjw */ public class MacUtil { public static void main(String[] args) { getMac().forEach(System.out::println); } /** * 獲取本機(jī) 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 字節(jié)數(shù)組格式化為全大寫(xiě)并且使用 - 作為分隔符的字符串 * * @param mac 獲取到的 mac 字節(jié)數(shù)組 * * @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(); } }
通過(guò)以上代碼理論上即可獲取本機(jī)所有的MAC
地址,此外通過(guò)format
方法可以將獲取到的MAC
地址統(tǒng)一處理成XX-XX-XX-XX-XX-XX
的格式,這里之所以說(shuō)是理論上,是因?yàn)槲以?jīng)在別人的蘋(píng)果電腦上運(yùn)行,結(jié)果并沒(méi)有得到所有MAC
地址(沒(méi)有得到執(zhí)行ifconfig -a
得到的所有MAC
地址,而且還會(huì)出現(xiàn)llw0
這個(gè)網(wǎng)絡(luò)的MAC
地址一直變動(dòng)),但是我在本地的虛擬機(jī)中運(yùn)行蘋(píng)果時(shí)卻也是正常,由于我自己沒(méi)有蘋(píng)果電腦,所以暫時(shí)也不清楚具體的原因,如果有知道的小伙伴,歡迎留言,提前感謝啦~~~
執(zhí)行命令行獲取
正如在上一部分中提到的,在某些情況下使用NetworkInterface
類(lèi)并不能獲取到本機(jī)所有的MAC
地址,甚至還可能出現(xiàn)動(dòng)態(tài)變化的情況(暫時(shí)不清楚原因)。因此,在這種情況下只能通過(guò)Java
的Runtime
類(lèi)的exec
方法直接執(zhí)行命令了,當(dāng)然在大多數(shù)情況下還是建議使用NetworkInterface
類(lèi),不僅方便,而且萬(wàn)一以后修復(fù)了上面的bug(不知道算不算是bug,還是我個(gè)人的問(wèn)題),不對(duì)上述代碼做任何變動(dòng)就可以得到自己執(zhí)行命令的效果了,說(shuō)了那么多,先看看如果通過(guò)自己執(zhí)行命令獲取本機(jī)的所有MAC
地址吧,先直接展示代碼:
/** * 獲取 mac 地址工具類(lèi) 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); } /** * 根據(jù)不同操作系統(tǒng)執(zhí)行不同命令 * 獲取本機(jī) 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(); } /** * 通過(guò)正則表達(dá)式提取執(zhí)行命令得到的結(jié)果集中的 mac 地址 * 并調(diào)整得到的 mac 地址的格式 * * @param command 查看網(wǎng)絡(luò)信息的命令 * * @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; } /** * 執(zhí)行命令并得到結(jié)果的每一行組成的字符串?dāng)?shù)組 * * @param command 查看網(wǎng)絡(luò)信息的命令 * * @return 執(zhí)行命令返回的所有數(shù)據(jù)行 */ 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; } }
到此這篇關(guān)于詳解Java如何跨平臺(tái)獲取MAC地址的文章就介紹到這了,更多相關(guān)Java跨平臺(tái)獲取MAC地址內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JAVA獲取本地MAC地址的方法
- JAVA如何獲取客戶(hù)端IP地址和MAC地址
- java根據(jù)本地IP獲取mac地址的方法
- java 獲取用戶(hù)的MAC地址多種方法實(shí)例詳解
- java 獲取mac地址的兩種方法(推薦)
- Java 獲取本機(jī)的IP與MAC地址實(shí)現(xiàn)詳解
- java編程實(shí)現(xiàn)獲取服務(wù)器IP地址及MAC地址的方法
- Java編程實(shí)現(xiàn)遍歷兩個(gè)MAC地址之間所有MAC的方法
- java實(shí)現(xiàn)獲取用戶(hù)的MAC地址
- Java獲取mac地址的方法
- java通過(guò)ip獲取客戶(hù)端Mac地址的小例子
相關(guān)文章
Java 將文件轉(zhuǎn)為字節(jié)數(shù)組知識(shí)總結(jié)及實(shí)例詳解
這篇文章主要介紹了Java 將文件轉(zhuǎn)為字節(jié)數(shù)組實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12使用MyBatis查詢(xún)千萬(wàn)級(jí)數(shù)據(jù)量操作實(shí)現(xiàn)
這篇文章主要為大家介紹了如何使用MyBatis?查詢(xún)千萬(wàn)數(shù)據(jù)量的操作過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05深入了解Java核心類(lèi)庫(kù)--Objects類(lèi)
這篇文章主要介紹了Java中的Object類(lèi)詳細(xì)介紹,本文講解了Object類(lèi)的作用、Object類(lèi)的主要方法、Object類(lèi)中不能被重寫(xiě)的方法、Object類(lèi)的equals方法重寫(xiě)實(shí)例等內(nèi)容,需要的朋友可以參考下2021-07-07Java數(shù)據(jù)結(jié)構(gòu)之鏈表的增刪查改詳解
今天帶大家來(lái)學(xué)習(xí)Java鏈表的增刪改查的相關(guān)知識(shí),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05java微信開(kāi)發(fā)第二步 獲取消息和回復(fù)消息
這篇文章主要為大家分享java微信開(kāi)發(fā)的第二步,如何獲取消息和回復(fù)消息,感興趣的小伙伴們可以參考一下2016-05-05Java使用poi-tl1.9.1生成Word文檔的技巧分享
本文將簡(jiǎn)單介紹poi-tl的相關(guān)知識(shí),通過(guò)一個(gè)實(shí)際的案例實(shí)踐,充分介紹如何利用poi-tl進(jìn)行目標(biāo)文檔的生成,同時(shí)分享幾個(gè)不同的office版本如何進(jìn)行圖表生成的解決方案,需要的朋友可以參考下2023-09-09Java的線(xiàn)程池ThreadPoolExecutor及多種線(xiàn)程池實(shí)現(xiàn)詳解
這篇文章主要介紹了Java的線(xiàn)程池ThreadPoolExecutor及多種線(xiàn)程池實(shí)現(xiàn)詳解,ThreadPoolExecutor 使用 int 的高 3 位來(lái)表示線(xiàn)程池狀態(tài),低 29 位表示線(xiàn)程數(shù)量,之所以將信息存儲(chǔ)在一個(gè)變量中,是為了保證原子性,需要的朋友可以參考下2024-01-01