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:
Spring Security and OpenID Connect
HttpClient 4 – Follow Redirects for POST
Java Program to Perform Polygon Containment Test
Weak References in Java
Hamcrest Collections Cookbook
Spring Boot - Building RESTful Web Services
How to Add a Single Element to a Stream
Intro to Inversion of Control and Dependency Injection with Spring
Stack Memory and Heap Space in Java
Spring Boot - Rest Controller Unit Test
Sử dụng CyclicBarrier trong Java
@DynamicUpdate with Spring Data JPA
Quick Intro to Spring Cloud Configuration
Java Program to Implement SimpeBindings API
Java Program to Implement Adjacency List
Spring Boot - Sending Email
Java Program to Implement Sorted Singly Linked List
Easy Ways to Write a Java InputStream to an OutputStream
Java Program to Implement Triply Linked List
Spring MVC + Thymeleaf 3.0: New Features
Spring WebFlux Filters
New Features in Java 14
Serverless Functions with Spring Cloud Function
Java Program to Describe the Representation of Graph using Adjacency List
Hướng dẫn sử dụng Lớp FilePermission trong java
Spring Security Basic Authentication
Java Program to Perform Encoding of a Message Using Matrix Multiplication
StringBuilder vs StringBuffer in Java
Java Program to Represent Graph Using Adjacency List
Java Program to Perform Right Rotation on a Binary Search Tree
Java Program to Check Whether a Weak Link i.e. Articulation Vertex Exists in a Graph
Hướng dẫn sử dụng Printing Service trong Java