我想知道在Java中是否有一种方法可以获取计算机名称?我看到了几个使用java.net.InetAddress
的答案。但是我想知道是否有不使用网络的方法?
(另外一个问题,计算机名称只是一个网络事物吗,因此必须通过这种方式完成吗?)
我想知道在Java中是否有一种方法可以获取计算机名称?我看到了几个使用java.net.InetAddress
的答案。但是我想知道是否有不使用网络的方法?
(另外一个问题,计算机名称只是一个网络事物吗,因此必须通过这种方式完成吗?)
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");
}
我同意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的答案。
SESSION_MANAGER
变量。但你需要解析它,因为它看起来像这样:local/<<name>>:@/tmp/.ICE-unix/2131,unix/<<name>>:/tmp/.ICE-unix/2131
。 - Sharcoux我对互联网上和这里提供的 InetAddress.getLocalHost().getHostName()
解决方案并不是很满意。该方法将获取从网络视角看到的主机名。我认为有两个问题:
如果主机有多个网络接口怎么办?主机可能有多个名称出现在网络中。据我所知,该方法返回的名称是不确定的。
如果主机没有连接到任何网络且没有网络接口怎么办?
我知道的所有操作系统都有一个将节点/主机命名的概念,无论是否与网络相连。Java不能以一种简单的方式返回这一点,令人遗憾。在所有版本的Windows上,这将是环境变量 COMPUTERNAME
,在Unix / Linux / MacOS上,这将是环境变量 HOSTNAME
(或者是来自 host 命令的输出 hostname
,如果HOSTNAME
环境变量不可用,如 Bourne 和 Korn 等旧 shell 的情况下)。
我会编写一个方法,该方法将检索(取决于操作系统)这些操作系统变量,并仅在最后使用 InetAddress.getLocalHost().getHostName()
方法作为最后手段。但这只是我的想法。
正如其他人指出的那样,对于 Unix / Linux 上的 Java 应用程序,HOSTNAME
环境变量通常不可用,因为默认情况下没有导出。除非您控制客户端,否则这不是一个可靠的方法。这真的很糟糕。为什么没有一种带有这些信息的标准属性呢?
唯一可靠的Unix/Linux获取主机名的方法似乎是通过JNI调用gethostname()或使用Runtime.exec()
命令来捕获hostname
命令的输出。我并不喜欢这些想法,但如果有更好的想法,我非常愿意倾听。(更新:我最近发现了gethostname4j,它似乎是我的救星)
我在另一个帖子中的另一个答案中提供了详细解释。特别是因为它试图建立一些术语,给出了当InetAddress.getLocalHost().getHostName()
方法失效时的具体示例,并指向目前我所知道的唯一安全的解决方案,即gethostname4j。
Java没有提供一种获取计算机名称的方法,这很遗憾。如果你能,请为JDK-8169296投票。
5
。后续的猫应该被命名为5e
和6
;) (尽管我想如果你是老派的话,你可以把一个命名为TenBaseTee
) - Brian Roach