Java 通過 Inet4Address、Inet6Address 兩個 final 子類區分 IPv4 與 IPv6 地址,均繼承自 InetAddress。本文講解如何識別地址類型、IPv6 兼容地址判斷及實用代碼模式。
public final class Inet4Address extends InetAddress // IPv4
public final class Inet6Address extends InetAddress // IPv6
兩者分別按協議規範實現父類方法。Inet6Address 額外提供:
public boolean isIPv4CompatibleAddress() // 判斷是否為 IPv4 兼容地址
格式:前 12 字節全 0,後 4 字節為 IPv4 地址。常見寫法:
::ffff:192.168.1.10 (IPv4 映射地址,最常見)::192.168.1.10 (舊式兼容地址,已棄用)0:0:0:0:0:ffff:c0a8:010a (全十六進制)isIPv4CompatibleAddress() 對上述均返回 true。
InetAddress addr = InetAddress.getByName("www.example.com");
byte[] bytes = addr.getAddress();
if (bytes.length == 4) System.out.println("IPv4");
else if (bytes.length == 16) System.out.println("IPv6");
if (addr instanceof Inet4Address) System.out.println("IPv4");
else if (addr instanceof Inet6Address) System.out.println("IPv6");
String host = addr.getHostAddress();
if (host.contains(":")) System.out.println("IPv6"); // 包含冒號
else System.out.println("IPv4");
public class IpTypeDetector {
public static void main(String[] args) throws Exception {
if (args.length == 0) return;
InetAddress addr = InetAddress.getByName(args[0]);
System.out.println("IP: " + addr.getHostAddress());
// 方法 1: byte 數組長度
switch (addr.getAddress().length) {
case 4: System.out.println("→ byte[] 長度判斷: IPv4"); break;
case 16: System.out.println("→ byte[] 長度判斷: IPv6"); break;
}
// 方法 2: instanceof
if (addr instanceof Inet4Address)
System.out.println("→ instanceof 判斷: IPv4");
else if (addr instanceof Inet6Address)
System.out.println("→ instanceof 判斷: IPv6");
// 方法 3: IPv6 兼容檢查 (僅 IPv6)
if (addr instanceof Inet6Address) {
Inet6Address ipv6 = (Inet6Address) addr;
if (ipv6.isIPv4CompatibleAddress())
System.out.println("→ 此為 IPv4 兼容/映射地址");
}
}
}
$ java IpTypeDetector www.csdn.net
IP: 211.100.26.122
→ byte[] 長度判斷: IPv4
→ instanceof 判斷: IPv4
$ java IpTypeDetector www.neu6.edu.cn
IP: 2001:da8:9000:b255:200:e8ff:feb0:5c5e
→ byte[] 長度判斷: IPv6
→ instanceof 判斷: IPv6
$ java IpTypeDetector ::ffff:192.168.1.10
IP: ::ffff:192.168.1.10
→ byte[] 長度判斷: IPv6
→ instanceof 判斷: IPv6
→ 此為 IPv4 兼容/映射地址
instanceof,語義清晰且性能極佳 (JVM 優化)。getAddress().length (4/16) 作為標識。::ffff:x.x.x.x) 時,可提取後 4 字節轉為 IPv4 邏輯處理。getByName 解析 IPv6 域名會拋 UnknownHostException。