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:
Creating a Web Application with Spring 5
Spring REST API with Protocol Buffers
Java Program to Perform Preorder Recursive Traversal of a Given Binary Tree
Tính kế thừa (Inheritance) trong java
Java 8 – Powerful Comparison with Lambdas
Guide To CompletableFuture
Hướng dẫn sử dụng Java Annotation
Quick Intro to Spring Cloud Configuration
Phân biệt JVM, JRE, JDK
Summing Numbers with Java Streams
Spring REST with a Zuul Proxy
Custom Thread Pools In Java 8 Parallel Streams
Java Program to Solve Set Cover Problem assuming at max 2 Elements in a Subset
@DynamicUpdate with Spring Data JPA
Predicate trong Java 8
Overview of Spring Boot Dev Tools
Phương thức tham chiếu trong Java 8 – Method References
Java Program to implement Array Deque
Finding Max/Min of a List or Collection
Java Program to Implement the Program Used in grep/egrep/fgrep
Tổng quan về ngôn ngữ lập trình java
Sort a HashMap in Java
Anonymous Classes in Java
LinkedHashSet trong Java hoạt động như thế nào?
Java Program to Construct an Expression Tree for an Postfix Expression
Java Program to Apply Above-Below-on Test to Find the Position of a Point with respect to a Line
Java Program to Find the Peak Element of an Array O(n) time (Naive Method)
Java Program to Implement Triply Linked List
Easy Ways to Write a Java InputStream to an OutputStream
Guide to PriorityBlockingQueue in Java
Java Program to Perform the Shaker Sort
Mệnh đề Switch-case trong java