我想知道是否有办法在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)
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的答案.
pet*_*erh 43
我对InetAddress.getLocalHost().getHostName()解决方案并不那么激动,你可以在互联网上找到这么多地方,也确实在这里.从网络角度看,该方法将为您提供主机名.我可以看到两个问题:
如果主机有多个网络接口怎么办?主机可以通过多个名称在网络上知道.通过所述方法返回的那个是不确定的.
如果主机未连接到任何网络且没有网络接口,该怎么办?
我所知道的所有操作系统都具有命名节点/主机的概念,而与网络无关.很遗憾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.
| 归档时间: |
|
| 查看次数: |
113725 次 |
| 最近记录: |