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 Program to add two large numbers using Linked List
Spring Boot - Cloud Configuration Client
Using Optional with Jackson
Hướng dẫn Java Design Pattern – Transfer Object
Guide to DelayQueue
Java Program to Check if any Graph is Possible to be Constructed for a Given Degree Sequence
Spring 5 Functional Bean Registration
Ignore Null Fields with Jackson
Spring Security Registration – Resend Verification Email
Send email with SMTPS (eg. Google GMail)
Spring MVC + Thymeleaf 3.0: New Features
Immutable ArrayList in Java
Java Program to Implement Efficient O(log n) Fibonacci generator
Quick Guide to Spring MVC with Velocity
Check If a File or Directory Exists in Java
An Intro to Spring Cloud Vault
Set Interface trong Java
Spring Security Custom AuthenticationFailureHandler
Spring Security 5 for Reactive Applications
How to Read a Large File Efficiently with Java
Java Program to Perform Searching Using Self-Organizing Lists
REST Web service: Basic Authentication trong Jersey 2.x
Java Program to Find a Good Feedback Vertex Set
Logging in Spring Boot
Guide to Dynamic Tests in Junit 5
Java Program to Implement Sorted Singly Linked List
Java Program to Check whether Directed Graph is Connected using DFS
Spring REST API + OAuth2 + Angular
Lập trình đa luồng với CompletableFuture trong Java 8
Control the Session with Spring Security
Servlet 3 Async Support with Spring MVC and Spring Security
Java Program to Perform Stooge Sort