InetAddress 無 public 構造器,必須通過 4 個靜態工廠方法創建實例。本文系統講解 getLocalHost、getByName、getAllByName、getByAddress 的參數、異常、返回值差異及適用場景。
| 方法 | 參數 | 返回 | 異常 | 核心特點 |
|---|---|---|---|---|
getLocalHost() | 無 | InetAddress | UnknownHostException | 獲取本機地址,多 IP 只返回第一個 |
getByName(String host) | 域名/IP | InetAddress | UnknownHostException | 最常用,域名自動 DNS 解析,多 IP 返回第一個 |
getAllByName(String host) | 域名/IP | InetAddress[] | UnknownHostException | 返回所有解析 IP,含 IPv4/IPv6 混合 |
getByAddress(byte[] addr) | byte[] (4或16字節) | InetAddress | UnknownHostException | 純本地構造,**無 DNS 查詢**,IP 可不存在 |
getByAddress(String host, byte[] addr) | 主機名 + byte[] | InetAddress | UnknownHostException | 指定關聯主機名 (別名),無 DNS 查詢 |
InetAddress local = InetAddress.getLocalHost();
System.out.println(local); // 輸出: ComputerName/192.168.18.10 (toString 格式: hostName/IP)
toString() 實現:hostName + "/" + getHostAddress()。
多 IP 機器只返回第一個,需用 getAllByName(hostName) 獲取全部。
// 域名
InetAddress addr = InetAddress.getByName("www.csdn.net"); // 返回第一個 IP
System.out.println(addr); // www.csdn.net/211.100.26.124
// 本機名
InetAddress addr2 = InetAddress.getByName("ComputerName"); // 等同 getLocalHost()
// localhost
InetAddress addr3 = InetAddress.getByName("localhost"); // 127.0.0.1
// hosts 文件映射 (C:\Windows\System32\drivers\etc\hosts)
// 192.168.18.100 www.mysite.com
InetAddress addr4 = InetAddress.getByName("www.mysite.com"); // www.mysite.com/192.168.18.100
// 直接傳 IP 字符串 (無 DNS 查詢,不驗證 IP 有效性)
InetAddress addr5 = InetAddress.getByName("129.42.58.212"); // /129.42.58.212 (hostName 為空)
InetAddress[] addrs = InetAddress.getAllByName("www.csdn.net");
for (InetAddress a : addrs) System.out.println(a);
// 輸出 4 個 IP:
// www.csdn.net/211.100.26.124
// www.csdn.net/211.100.26.121
// www.csdn.net/211.100.26.122
// www.csdn.net/211.100.26.123
關鍵發現:getByName(host)內部實現即getAllByName(host)[0]。
InetAddress[] addrs = InetAddress.getAllByName("211.100.26.122");
// 輸出單個: /211.100.26.122 (hostName 為空)
**零網路開銷**,不驗證 IP 合法性/可達性,僅構造對象。數組長度必須為 4 (IPv4) 或 16 (IPv6)。
// 重載 1: 僅 IP 字節
byte[] ip = {(byte)141, (byte)146, 8, 66}; // 141.146.8.66
InetAddress addr1 = InetAddress.getByAddress(ip);
System.out.println(addr1); // /141.146.8.66
// 重載 2: 指定關聯主機名 (別名)
InetAddress addr2 = InetAddress.getByAddress("Oracle官方網站", ip);
System.out.println(addr2); // Oracle官方網站/141.146.8.66
第二重載的 host 參數**不觸發 DNS**,僅作為顯示別名存入對象。可傳任意字符串。
UnknownHostException:域名不存在、DNS 故障、getByAddress 數組長度非 4/16。try-catch 或 throws。getByName/getAllByName **永不拋出** UnknownHostException (即使 IP 不存在)。| 場景 | 推薦方法 | 理由 |
|---|---|---|
| 獲取本機 IP | getLocalHost() | 最直接 |
| 獲取本機所有 IP | getAllByName(getLocalHost().getHostName()) | 繞過 getLocalHost 單 IP 限制 |
| 域名解析 (單 IP 足夠) | getByName(domain) | 簡潔,內部緩存 |
| 域名解析 (需所有 IP、負載均衡) | getAllByName(domain) | 獲取完整解析集合 |
| 已知 IP 字節 (配置文件、協議解析) | getByAddress(bytes) | 零 DNS,極快,適合熱路徑 |
| 需關聯顯示名稱 (日志、UI) | getByAddress(name, bytes) | 封裝別名,無網路開銷 |