获取Java中的计算机名称

dan*_*dev 50 java

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

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

Bri*_*ach 83

计算机"名"是解决从IP地址由底层DNS的操作系统(域名系统)库.操作系统中没有计算机名称的通用概念,但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");
}
Run Code Online (Sandbox Code Playgroud)

  • 当OP要求解决方案时,我想知道这是如何成为可接受的答案:"一种不使用网络的方式?" (33认同)

Jav*_*tor 51

我同意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";
}
Run Code Online (Sandbox Code Playgroud)

我在Windows 7中对此进行了测试,但它确实有效.如果peterh是对的,else if应该照顾Mac和Linux.也许有人可以测试一下?else如果你想要额外的稳健性,你也可以在里面实现Brian Roach的答案.

  • 至少对于 Ubuntu 14.04,这是行不通的。唯一出现计算机名称的环境变量是“SESSION_MANAGER”变量。但是你需要解析它,因为它看起来像这样:`local/&lt;&lt;name&gt;&gt;:@/tmp/.ICE-unix/2131,unix/&lt;&lt;name&gt;&gt;:/tmp/.ICE-unix/2131` (2认同)
  • 我宁愿做函数`public static` (2认同)

pet*_*erh 43

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

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

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

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

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

更新(统一)

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

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

长读

我在另一篇文章的另一个答案中创建了一个很长的解释.特别是你可能想要阅读它,因为它试图建立一些术语,给出InetAddress.getLocalHost().getHostName()解决方案何时失败的具体例子,并指出我目前唯一安全的解决方案,即gethostname4j.

令人遗憾的是Java没有提供获取计算机名的方法.如果你能投票支持JDK-8169296.