1. 序章

このチュートリアルでは、Javaを使用してローカルマシンのMACアドレスを取得します。

MACアドレスは、物理ネットワークインターフェイスカードの一意の識別子です。

ここではMACアドレスについてのみ説明しますが、ネットワークインターフェイスのより一般的な概要については、Javaのネットワークインターフェイスの操作を参照してください。

2. 例

以下の例では、 java.net.NetworkInterfaceおよびjava.net.InetAddressAPIを使用します。

2.1. マシンローカルホスト

まず、マシンのローカルホストのMACアドレスを取得しましょう。

InetAddress localHost = InetAddress.getLocalHost();
NetworkInterface ni = NetworkInterface.getByInetAddress(localHost);
byte[] hardwareAddress = ni.getHardwareAddress();

NetworkInterface#getHardwareAddressはバイトの配列を返すため、結果をフォーマットできます。

String[] hexadecimal = new String[hardwareAddress.length];
for (int i = 0; i < hardwareAddress.length; i++) {
    hexadecimal[i] = String.format("%02X", hardwareAddress[i]);
}
String macAddress = String.join("-", hexadecimal);

String#formatを使用して配列内の各バイトを16進数にフォーマットする方法に注目してください。

その後、フォーマットされたすべての要素を「-」(ダッシュ)で結合できます。

2.2. ローカルIP

次に、特定のローカルIPアドレスのMACアドレスを取得しましょう。

InetAddress localIP = InetAddress.getByName("192.168.1.108");
NetworkInterface ni = NetworkInterface.getByInetAddress(localIP);
byte[] macAddress = ni.getHardwareAddress();

ここでも、MACアドレスのバイト配列を取得する方法に注目してください。

2.3. すべてのネットワークインターフェイス

最後に、マシン上のすべてのネットワークインターフェイスのMACアドレスを取得しましょう。

Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
    NetworkInterface ni = networkInterfaces.nextElement();
    byte[] hardwareAddress = ni.getHardwareAddress();
    if (hardwareAddress != null) {
        String[] hexadecimalFormat = new String[hardwareAddress.length];
        for (int i = 0; i < hardwareAddress.length; i++) {
            hexadecimalFormat[i] = String.format("%02X", hardwareAddress[i]);
        }
        System.out.println(String.join("-", hexadecimalFormat));
    }
}

getNetworkInterfacesは物理インターフェイスと仮想インターフェイスの両方を返すため、仮想インターフェイスを除外する必要があります。

これは、たとえば、getHardwareAddressでnullチェックを実行することで実行できます。

3. 結論

このクイックチュートリアルでは、ローカルマシンのMACアドレスを取得するさまざまな方法について説明しました。

いつものように、このチュートリアルの例を含むすべてのソースコードは、GitHubにあります。