Java “是”吗&引用;是否在有效的IP字符串中,足以确定它是IPv6地址?

Java “是”吗&引用;是否在有效的IP字符串中,足以确定它是IPv6地址?,java,ipv6,Java,Ipv6,给定一个100%明确表示有效的IP地址的字符串 但是,将其作为参数接收的方法不会接收另一个参数,告诉它它是IPv4还是IPv6 我发现了一种确定IPv4还是IPv6的方法: InetAddress address = InetAddress.getByName(ip); if (address instanceof Inet6Address) { // It's ipv6 } else if (address instanceof Inet4Address) { // It's

给定一个100%明确表示有效的IP地址的字符串

但是,将其作为参数接收的方法不会
接收另一个参数,告诉它它是IPv4还是IPv6

我发现了一种确定IPv4还是IPv6的方法:

InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
    // It's ipv6
} else if (address instanceof Inet4Address) {
    // It's ipv4
}
但是我正在寻找一种更快的方法(注意上面的内容也应该包含try/catch)

我能做一些简单的事情吗

if (totallyValidIp.contains(":") {
        // It's ipv6
}
else {
        // It's ipv4
}
还是有一个我不知道的陷阱?(例如,不包含任何“:”的有效IPv6)


注意:这个“优化”是基于这样一个事实,即我知道IP字符串是一个已经检查和验证的IP地址。

有一个陷阱,如果使用
InetAddress
,仅检查
是不够的

模式为
::ffff:
的地址被视为IPv4地址。例如,以下调用返回一个
Inet4Address

InetAddress.getByName("::ffff:1.2.3.4")
相同地址的所有变体也是如此,如
::0:ffff:1.2.3.4

从:

IPv4映射地址
此IPv6地址的形式为::ffff:w.x.y.z,用于表示IPv4地址。它允许本机程序在与IPv4和IPv6节点通信时使用相同的地址数据结构和相同的套接字

在InetAddress和Inet6Address中,用于内部表示;它没有功能性作用。Java永远不会返回IPv4映射地址。这些类可以以字节数组和文本表示形式将IPv4映射地址作为输入。但是,它将被转换为IPv4地址


但这似乎是唯一的例外。

有一个问题,如果使用
InetAddress
,仅检查
是不够的

模式为
::ffff:
的地址被视为IPv4地址。例如,以下调用返回一个
Inet4Address

InetAddress.getByName("::ffff:1.2.3.4")
相同地址的所有变体也是如此,如
::0:ffff:1.2.3.4

从:

IPv4映射地址
此IPv6地址的形式为::ffff:w.x.y.z,用于表示IPv4地址。它允许本机程序在与IPv4和IPv6节点通信时使用相同的地址数据结构和相同的套接字

在InetAddress和Inet6Address中,用于内部表示;它没有功能性作用。Java永远不会返回IPv4映射地址。这些类可以以字节数组和文本表示形式将IPv4映射地址作为输入。但是,它将被转换为IPv4地址


但这似乎是唯一的例外。

IPv6地址字符串将包含两到七个冒号,不一定是连续的。但是,如果您已经在其他地方验证了地址,那么检查是否存在冒号就足够了


但是如果您已经有了
InetAddress
对象,只需使用
instanceof
。来回转换为字符串听起来像是一项不必要的工作。

一个IPv6地址字符串将包含两到七个冒号,不一定是连续的。但是,如果您已经在其他地方验证了地址,那么检查是否存在冒号就足够了


但是如果您已经有了
InetAddress
对象,只需使用
instanceof
。来回转换为字符串听起来像是一项不必要的工作。

如果地址包含端口怎么办?i、 e.
127.0.0.1:1337
Yea。一个问题是
ip
实际上可能是一个DNS名称;看见但是如果是,那么它就不能包含
字符,因此启发式失败。第一种方法并不麻烦。它简短、清晰且易于阅读。@JacobG-IP地址不能包含端口。如果是,则它不是有效的IP地址。(或主机名)@datv为什么速度快?在我看来,您在不需要优化的地方进行了过度优化。如果地址包含端口怎么办?i、 e.
127.0.0.1:1337
Yea。一个问题是
ip
实际上可能是一个DNS名称;看见但是如果是,那么它就不能包含
字符,因此启发式失败。第一种方法并不麻烦。它简短、清晰且易于阅读。@JacobG-IP地址不能包含端口。如果是,则它不是有效的IP地址。(或主机名)@datv为什么速度快?在我看来,你在不需要优化的地方进行了过度优化。谢谢你指出了问题所在并给出了明确的解释。幸运的是,在我的例子中,一个经过验证的字符串(即不是InetAddress)作为参数传递。向上投票。谢谢你指出了问题的症结和清楚的解释。幸运的是,在我的例子中,一个经过验证的字符串(即不是InetAddress)作为参数传递。向上投票。我还没有
InetAddress
(尽管我总是可以创建一个)。幸运的是,在我的例子中,一个经过验证的字符串(即not
InetAddress
)作为参数传递。我已经确认提议的“快捷解决方案”有效。接受。我还没有
InetAddress
(尽管我总是可以创建一个)。幸运的是,在我的例子中,一个经过验证的字符串(即not
InetAddress
)作为参数传递。我已经确认提议的“快捷解决方案”有效。接受。