我想知道是否有办法在Java中获取计算机名称?我看过几个以java.net.InetAddress
为特色的答案。但是我想知道是否有一种方法不使用网络?
(作为一个附带问题,无论如何计算机名称只是一个网络的东西,所以必须这样做?)
答案 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()
解决方案并不感到激动,你可以在互联网上找到这么多地方,也确实在这里。从网络角度看,该方法将为您提供主机名。我可以看到两个问题:
如果主机有多个网络接口怎么办?主机可以通过多个名称在网络上知道。所述方法返回的方法是不确定的。
如果主机未连接到任何网络并且没有网络接口,该怎么办?
我所知道的所有操作系统都具有命名节点/主机的概念,而与网络无关。很遗憾Java无法以简单的方式返回。这将是所有Windows版本上的环境变量COMPUTERNAME
和Unix / Linux / MacOS上的环境变量HOSTNAME
(如果{{1},则来自主机命令hostname
的输出。环境变量不可用,就像Bourne和Korn这样的旧shell一样。
我会编写一个方法来检索(取决于操作系统)这些操作系统变量,并且只作为最后的手段使用HOSTNAME
方法。但那只是我。
正如其他人所指出的那样,{/ 1}}环境变量通常不适用于Unix / Linux上的Java应用程序,因为默认情况下它不会导出。因此,除非您控制客户,否则这不是一种可靠的方法。这真的很糟糕。为什么没有这个信息的标准属性?
唉,据我所知,在Unix / Linux上唯一可靠的方法是对gethostname()进行JNI调用或使用InetAddress.getLocalHost().getHostName()
来捕获{{1}的输出命令。我并不特别喜欢这些想法,但如果有人有更好的想法,我会全神贯注。 (更新:我最近遇到了gethostname4j这似乎是我祈祷的答案。)
我在another answer on another post创建了一个很长的解释。特别是你可能想要阅读它,因为它试图建立一些术语,给出HOSTNAME
解决方案何时失败的具体例子,并指出我目前唯一知道的安全解决方案,即gethostname4j
令人遗憾的是Java没有提供获取计算机名的方法。如果你能够,可以投票给JDK-8169296。