在Java中获取计算机名称

我想知道是否有办法在Java中获得计算机名称? 我见过几个functionjava.net.InetAddress答案。 但是,我想知道是否有一种方式,不使用networking?

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

计算机“名称”由OS的底层DNS(域名系统)库从IP地址parsing。 跨操作系统的计算机名称没有普遍的概念,但DNS通常是可用的。 如果计算机名称尚未configuration,则DNS可以parsing,但不可用。

 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"); } 

我对InetAddress.getLocalHost().getHostName()解决scheme并不是那么激动,你可以在Internet上find这么多的地方,事实上也在这里。 从networking的angular度来看,这种方法将为您提供主机名。 我可以看到两个问题:

  1. 如果主机有多个networking接口怎么办? 主机可能在networking上被多个名称所知。 该方法返回的是不确定的afaik。

  2. 如果主机没有连接到任何networking并且没有networking接口?

我所知道的所有操作系统都有一个与节点/主机无关的概念。 很遗憾,Java不能以简单的方式返回。 这将是所有版本的Windows上的环境variablesCOMPUTERNAME和Unix / Linux / MacOS上的环境variablesHOSTNAME (或者,如果HOSTNAME环境variables不可用(如Bourne和Bourne科恩)。

我会写一个方法,将检索(取决于操作系统)这些操作系统variables,只作为最后的手段使用InetAddress.getLocalHost().getHostName()方法。 但那只是我。

更新(通用)

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

唉,就我所见,Unix / Linux上唯一可靠的方法是对gethostname()进行JNI调用,或使用Runtime.exec()hostname命令中捕获输出。 我不是特别喜欢这些想法,但如果有人有一个更好的主意,我全是耳朵。 (更新:我最近遇到了gethostname4j这似乎是我的祈祷答案)。

长时间阅读

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

Java不提供获取计算机名称的方法,这很令人伤心。 如果可以,请为JDK-8169296投票。

我同意peterh的回答,所以对于那些喜欢复制粘贴的人,而不是60多秒的Googlesearch结果:

 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中testing了这一点,它的工作原理。 如果peterh是对的, else if要照顾Mac和Linux。 也许有人可以testing这个? 如果你想要额外的健壮性,你也可以在else内部实现Brian Roach的答案。