有没有一种简单的方法将字符串转换为Java中的Inetaddress?

问题描述:

我想将字符串转换为Inetaddress。我不想解析主机名:字符串是ipv4地址。 InetAddress.getByName(String host)工作吗?或者我必须手动解析它?有没有一种简单的方法将字符串转换为Java中的Inetaddress?

com.google.common.net.InetAddresses.forString(String ipString)对此更好,因为无论传递给它的字符串如何,它都不会执行DNS查找。

+0

这是[Guava]的一部分(http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/com/google/common/net/InetAddresses.html)。 – 2012-06-19 16:37:07

+0

它应该是'com.google.common.net.InetAddresses.forString'(带有大写A的'InetAddresses')。因为编辑必须至少有6个字符,所以我不会允许我在你的回答中纠正这个问题。 ;-) 无论如何,谢谢,正在寻找它,又一次番石榴拯救了这一天。 – silmeth 2016-10-20 14:10:57

是的,这将工作。 The API对此非常清楚(“主机名称可以是机器名称,例如”java.sun.com“,也可以是其IP地址的文本表示。”),当然,您可以轻松检查自己。

+1

谢谢,我抬头的API,并错过了线。 – TiansHUo 2010-02-22 05:49:12

+0

什么时候主机是一个模式像192.168.0。*?这也能工作吗?关于Inet4Address doc,似乎支持这一点。 – Paranaix 2012-02-24 13:58:41

+0

@Paranaix,不会,它会抛出一个'IllegalArgumentException',特别是消息“无效主机通配符规范” – 2012-02-24 16:24:25

在通过StringgetByName()之前,您可以尝试using a regular expression to filter-out non-numeric IP addresses。那么getByName()将不会尝试名称解析。

当心:看来,解析一个无效的地址,如InetAddress.getByName("999.999.999.999")将导致异常正如人们从文档的这句期待:

地址格式的有效性进行检查

经验地说,我发现自己获得了一个InetAddress实例,其中包含本地计算机的原始IP地址和无效的IP地址作为主机名。当然,这不是我所期望的!

+2

从Java 7开始,这将抛出UnknownHostException;还没有检查早期的Java,但我也期望有一个例外。 – 2015-03-12 12:38:40

The open-source IPAddress Java library将验证IPv6和IPv4的所有标准表示,并且将在没有DNS查找的情况下进行验证。免责声明:我是该图书馆的项目经理。

下面的代码将做您要求什么:

 String s = "1.2.3.4"; 
    try { 
      IPAddressString str = new IPAddressString(s); 
      IPAddress addr = str.toAddress(); 
      InetAddress inetAddress = addr.toInetAddress(); //IPv4 or IPv6 
      if(addr.isIPv4() || addr.isIPv4Convertible()) {//IPv4 specific 
       IPv4Address ipv4Addr = addr.toIPv4(); 
       Inet4Address inetAddr = ipv4Addr.toInetAddress(); 
       //use address 
      } 
     } catch(AddressStringException e) { 
      //e.getMessage has validation error 
     }