获取Java中的计算机名称

时间:2011-10-25 00:48:55

标签: java

我想知道是否有办法在Java中获取计算机名称?我看过几个以java.net.InetAddress为特色的答案。但是我想知道是否有一种方法不使用网络?

(作为一个附带问题,无论如何计算机名称只是一个网络的东西,所以必须这样做?)

3 个答案:

答案 0 :(得分:79)

计算机“名称”由操作系统的基础DNS(域名系统)库从IP地址解析。操作系统中没有计算机名称的通用概念,但DNS通常是可用的。如果尚未配置计算机名称以便DNS可以解析它,则它不可用。

import java.net.InetAddress;
import java.net.UnknownHostException;

String hostname = "Unknown";

try
{
    InetAddress addr;
    addr = InetAddress.getLocalHost();
    hostname = addr.getHostName();
}
catch (UnknownHostException ex)
{
    System.out.println("Hostname can not be resolved");
}

答案 1 :(得分:44)

我同意peterh的回答,所以对于那些喜欢复制和粘贴的人而不是60多秒的谷歌搜索:

private String getComputerName()
{
    Map<String, String> env = System.getenv();
    if (env.containsKey("COMPUTERNAME"))
        return env.get("COMPUTERNAME");
    else if (env.containsKey("HOSTNAME"))
        return env.get("HOSTNAME");
    else
        return "Unknown Computer";
}

我在Windows 7中对此进行了测试,但它确实有效。如果peterh是对的,else if应该照顾Mac和Linux。也许有人可以测试一下?如果你想要更强大的话,你也可以在else内实现Brian Roach的答案。

答案 2 :(得分:42)

我对InetAddress.getLocalHost().getHostName()解决方案并不感到激动,你可以在互联网上找到这么多地方,也确实在这里。从网络角度看,该方法将为您提供主机名。我可以看到两个问题:

  1. 如果主机有多个网络接口怎么办?主机可以通过多个名称在网络上知道。所述方法返回的方法是不确定的。

  2. 如果主机未连接到任何网络并且没有网络接口,该怎么办?

  3. 我所知道的所有操作系统都具有命名节点/主机的概念,而与网络无关。很遗憾Java无法以简单的方式返回。这将是所有Windows版本上的环境变量COMPUTERNAME和Unix / Linux / MacOS上的环境变量HOSTNAME(如果{{1},则来自主机命令hostname的输出。环境变量不可用,就像Bourne和Korn这样的旧shell一样。

    我会编写一个方法来检索(取决于操作系统)这些操作系统变量,并且只作为最后的手段使用HOSTNAME方法。但那只是我。

    更新(Unices)

    正如其他人所指出的那样,{/ 1}}环境变量通常不适用于Unix / Linux上的Java应用程序,因为默认情况下它不会导出。因此,除非您控制客户,否则这不是一种可靠的方法。这真的很糟糕。为什么没有这个信息的标准属性?

    唉,据我所知,在Unix / Linux上唯一可靠的方法是对gethostname()进行JNI调用或使用InetAddress.getLocalHost().getHostName()来捕获{{1}的输出命令。我并不特别喜欢这些想法,但如果有人有更好的想法,我会全神贯注。 (更新:我最近遇到了gethostname4j这似乎是我祈祷的答案。)

    长读

    我在another answer on another post创建了一个很长的解释。特别是你可能想要阅读它,因为它试图建立一些术语,给出HOSTNAME解决方案何时失败的具体例子,并指出我目前唯一知道的安全解决方案,即gethostname4j

    令人遗憾的是Java没有提供获取计算机名的方法。如果你能够,可以投票给JDK-8169296