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:

Create a Custom Exception in Java
Hướng dẫn Java Design Pattern – Null Object
Use Liquibase to Safely Evolve Your Database Schema
Intro to Inversion of Control and Dependency Injection with Spring
Running Spring Boot Applications With Minikube
Hướng dẫn Java Design Pattern – Mediator
Spring Security OAuth2 – Simple Token Revocation
Using JWT with Spring Security OAuth (legacy stack)
Guide to the Synchronized Keyword in Java
Java Convenience Factory Methods for Collections
Java Program to Find the Longest Subsequence Common to All Sequences in a Set of Sequences
Hướng dẫn Java Design Pattern – Composite
Spring Boot - OAuth2 with JWT
Java Program to Implement Branch and Bound Method to Perform a Combinatorial Search
Spring RequestMapping
Java Program to Find Maximum Element in an Array using Binary Search
Quick Guide to Spring MVC with Velocity
REST Web service: Basic Authentication trong Jersey 2.x
Java Program to Construct K-D Tree for 2 Dimensional Data
Creating Docker Images with Spring Boot
Java Program to Implement Ternary Tree
Spring’s RequestBody and ResponseBody Annotations
Derived Query Methods in Spring Data JPA Repositories
So sánh HashSet, LinkedHashSet và TreeSet trong Java
Java Program to Implement Fisher-Yates Algorithm for Array Shuffling
The Guide to RestTemplate
Spring Data MongoDB – Indexes, Annotations and Converters
Converting Strings to Enums in Java
Java Program to Find the Number of Ways to Write a Number as the Sum of Numbers Smaller than Itself
XML Serialization and Deserialization with Jackson
Java Program to Perform Sorting Using B-Tree
Hướng dẫn Java Design Pattern – Visitor