For JDK1.6 or bigger:
import java.io.*; import java.net.*; import java.util.*; public class ListNetsEx { public static void main(String args[]) throws SocketException { Enumeration nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netint : Collections.list(nets)) displayInterfaceInformation(netint); } static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { System.out.println("Display name: " + netint.getDisplayName()); System.out.println("Hardware address: " + Arrays.toString(netint.getHardwareAddress())); } }
JDK1.5 or less
One way, without using JNI, is to launch an external utility and interpret the output.
In Windows, “arp -a” will return the MAC addresses of all adapters that have TCP/IP bound to them and have recently (default < 5 mins) resolved an IP address. Otherwise, in NT/2K/XP, “ipconfig /all” will return all relevant network info for IP-bound adapters, including the MAC address (displayed as “physical address”).
In Linux, “ifconfig” does something similar.
Example for Windows:
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 NetworkUtils { private final static int MACADDR_LENGTH = 17; private final static String WIN_OSNAME = "Windows"; private final static String WIN_MACADDR_REG_EXP = "^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$"; private final static String WIN_MACADDR_EXEC = "ipconfig /all"; public final static String getMacAddress() throws IOException { String os = System.getProperty("os.name"); try { if (os.startsWith(WIN_OSNAME)) { return winMacAddress(winIpConfigCommand()); } // other OS left as an exercise ! // LINUX --> else if (os.startsWith("Linux")) { ... // ... // Process p = Runtime.getRuntime().exec("ifconfig"); // MAC OSX --> else if(os.startsWith("Mac OS X")) { ... // ... // Process p = Runtime.getRuntime().exec("ifconfig"); else { throw new IOException("OS not supported : " + os); } } catch(ParseException e) { e.printStackTrace(); throw new IOException(e.getMessage()); } } private final static String winMacAddress(String ipConfigOutput) 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(ipConfigOutput, "\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 (winIsMacAddress(macAddressCandidate)) { lastMacAddress = macAddressCandidate; continue; } } ParseException ex = new ParseException ("cannot read MAC address from [" + ipConfigOutput + "]", 0); ex.printStackTrace(); throw ex; } private final static boolean winIsMacAddress(String macAddressCandidate) { if (macAddressCandidate.length() != MACADDR_LENGTH) return false; if (!macAddressCandidate.matches(WIN_MACADDR_REG_EXP)) return false; return true; } private final static String winIpConfigCommand() throws IOException { Process p = Runtime.getRuntime().exec(WIN_MACADDR_EXEC); 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; } public final static void main(String[] args) { try { System.out.println("MAC ADDRESS"); System.out.println(" OS : " + System.getProperty("os.name")); System.out.println(" IP/Localhost: " + InetAddress.getLocalHost().getHostAddress()); System.out.println(" MAC Address : " + getMacAddress()); } catch(Throwable t) { t.printStackTrace(); } } }
Done! Happy coding!
Related posts:
Java 8 Stream findFirst() vs. findAny()
Simplify the DAO with Spring and Java Generics
Java – Random Long, Float, Integer and Double
Receive email using IMAP
Java Program to Find Median of Elements where Elements are Stored in 2 Different Arrays
Login For a Spring Web App – Error Handling and Localization
Java Program to Perform Naive String Matching
Spring Boot - Exception Handling
Java Program to Use Above Below Primitive to Test Whether Two Lines Intersect
Lập trình hướng đối tượng (OOPs) trong java
Hướng dẫn Java Design Pattern – Memento
Java Program to Implement Word Wrap Problem
Java Program to Implement Self Balancing Binary Search Tree
Introduction to Apache Commons Text
Java Program to Implement Knight’s Tour Problem
Java Program to Implement Caesar Cypher
Guide to Character Encoding
Reversing a Linked List in Java
Exception Handling in Java
DynamoDB in a Spring Boot Application Using Spring Data
Custom Cascading in Spring Data MongoDB
Java Program to Implement AVL Tree
Java Program to Implement Bubble Sort
Giới thiệu Java 8
Tạo ứng dụng Java RESTful Client với thư viện Retrofit
Map Serialization and Deserialization with Jackson
Java Program to Implement K Way Merge Algorithm
Java Program to Check if a Point d lies Inside or Outside a Circle Defined by Points a, b, c in a Pl...
Java Program to Implement Affine Cipher
Extract links from an HTML page
Spring Security Custom AuthenticationFailureHandler
Java Program to Implement Borwein Algorithm