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:
Hướng dẫn Java Design Pattern – Observer
Spring REST with a Zuul Proxy
Guide to Mustache with Spring Boot
Java Program to Implement Merge Sort on n Numbers Without tail-recursion
The Spring @Controller and @RestController Annotations
Testing in Spring Boot
Call Methods at Runtime Using Java Reflection
Tìm hiểu về xác thực và phân quyền trong ứng dụng
Java Program to Perform Uniform Binary Search
Tính đa hình (Polymorphism) trong Java
Phương thức tham chiếu trong Java 8 – Method References
Java Program to Implement Karatsuba Multiplication Algorithm
Sử dụng CountDownLatch trong Java
Java Program to Perform Partition of an Integer in All Possible Ways
Java 14 Record Keyword
Getting a File’s Mime Type in Java
Java Program to Find Path Between Two Nodes in a Graph
Life Cycle of a Thread in Java
Java Program to implement Bi Directional Map
Hướng dẫn Java Design Pattern – Object Pool
Convert Time to Milliseconds in Java
Removing all Nulls from a List in Java
Java Program to Generate All Subsets of a Given Set in the Lexico Graphic Order
Java Program to Implement Dijkstra’s Algorithm using Priority Queue
Lớp LinkedHashMap trong Java
Java Program to Implement D-ary-Heap
Java Byte Array to InputStream
Supplier trong Java 8
@DynamicUpdate with Spring Data JPA
Spring Boot - Sending Email
Getting Started with Stream Processing with Spring Cloud Data Flow
Java Program to Find the Connected Components of an UnDirected Graph