Extract network card address

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 Encode a Message Using Playfair Cipher
Injecting Prototype Beans into a Singleton Instance in Spring
Spring WebClient vs. RestTemplate
Các chương trình minh họa sử dụng Cấu trúc điều khiển trong Java
Java String to InputStream
Java equals() and hashCode() Contracts
A Guide to Spring Cloud Netflix – Hystrix
Java Program to Implement Merge Sort on n Numbers Without tail-recursion
The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5
Spring Cloud – Adding Angular
Java Program to Check whether Directed Graph is Connected using BFS
Map to String Conversion in Java
Java Program to Perform Addition Operation Using Bitwise Operators
Spring Boot - Quick Start
Spring Boot: Customize Whitelabel Error Page
Java Program to Implement Coppersmith Freivald’s Algorithm
Disable DNS caching
Hướng dẫn sử dụng Java Reflection
Java Program to Implement Hash Tables chaining with Singly Linked Lists
How to Change the Default Port in Spring Boot
Java Program to Implement Multi-Threaded Version of Binary Search Tree
Apache Commons Collections OrderedMap
Java Program to Implement Quick sort
Java Program to Implement the Checksum Method for Small String Messages and Detect
Spring Boot - Scheduling
Using Optional with Jackson
Inheritance and Composition (Is-a vs Has-a relationship) in Java
Giới thiệu thư viện Apache Commons Chain
Java Program to Find Shortest Path Between All Vertices Using Floyd-Warshall’s Algorithm
Lớp Arrarys trong Java (Arrays Utility Class)
Concurrent Test Execution in Spring 5
Serialize Only Fields that meet a Custom Criteria with Jackson