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:
Tạo ứng dụng Java RESTful Client với thư viện Retrofit
Java Program to Implement Multi-Threaded Version of Binary Search Tree
What is Thread-Safety and How to Achieve it?
@DynamicUpdate with Spring Data JPA
Guide to the Java TransferQueue
Custom Error Pages with Spring MVC
Java Program to Perform Matrix Multiplication
Jackson – Marshall String to JsonNode
Spring Security Login Page with React
Java Program to Implement Horner Algorithm
Java toString() Method
Java Program to Solve Knapsack Problem Using Dynamic Programming
Java Program to Implement First Fit Decreasing for 1-D Objects and M Bins
Introduction to Spring Cloud Rest Client with Netflix Ribbon
Programmatic Transaction Management in Spring
A Guide to Apache Commons Collections CollectionUtils
Hướng dẫn Java Design Pattern – DAO
Java Program to Find Strongly Connected Components in Graphs
Java Program to Implement Brent Cycle Algorithm
Java Program to Implement IdentityHashMap API
Java Program to Implement Hash Tables Chaining with Doubly Linked Lists
Converting Between a List and a Set in Java
Java IO vs NIO
HttpClient 4 – Follow Redirects for POST
Guide to CopyOnWriteArrayList
Spring WebFlux Filters
Configuring a DataSource Programmatically in Spring Boot
Spring MVC Setup with Kotlin
Quản lý bộ nhớ trong Java với Heap Space vs Stack
Java Program to Find the Longest Path in a DAG
Java Program to Perform Left Rotation on a Binary Search Tree
Java Program to Implement Depth-limited Search