问题

以下哪项是获取Java当前计算机主机名的最佳和最便携的方法?

Runtime.getRuntime().exec("hostname")

VS

InetAddress.getLocalHost().getHostName()

#1 热门回答(289 赞)

严格来说 - 你别无选择,只能在Unixgethostname(2)上调用hostname(1)或者。这是你的计算机的名称。任何通过IP地址确定主机名的尝试都是这样的

InetAddress.getLocalHost().getHostName()

在某些情况下必然会失败:

IP地址可能无法解析为任何名称。错误的DNS设置,糟糕的系统设置或错误的提供商设置可能是这个原因。

DNS中的名称可以有许多名为CNAME的别名。这些只能在一个方向上正确解决:名称到地址。反方向是模棱两可的。哪一个是"官方"名称?

主机可以有许多不同的IP地址 - 每个地址可以有许多不同的名称。两种常见情况是:一个以太网端口有几个"逻辑"IP地址,或者计算机有几个以太网端口。它是可配置的,无论它们共享IP还是具有不同的IP。这被称为"多宿主"。

DNS中的一个名称可以解析为多个IP地址。并非所有这些地址都必须位于同一台计算机上! (用例:一种简单的负载均衡形式)

我们甚至不开始讨论动态IP地址。

另外,请勿将IP地址的名称与主机名(主机名)混淆。一个比喻可能会让它更清晰:

有一个叫做"伦敦"的大城市(服务器)。在城墙里面发生了很多事情。这个城市有几个门(IP地址)。每个门都有一个名称("北门","河门","南安普顿门"......),但门的名称不是城市的名称。此外,你不能通过使用门的名称来推断城市的名称 - "北门"将捕获一半的大城市,而不只是一个城市。然而 - 一个陌生人(IP包)沿着河边走来问当地人:"我有一个奇怪的地址:'Rivergate,第二个左边,第三个房子'。你能帮助我吗?"当地人说:"当然,你走在正确的道路上,只需前进,你将在半小时内抵达目的地。"

这说明了我的想法。

好消息是:Therealhostname通常不是必需的。在大多数情况下,任何解析为此主机上的IP地址的名称都可以。 (陌生人可能会通过Northgate进入城市,但乐于助人的当地人会翻译"左二"部分。)

如果剩下的极端情况,你必须使用此配置设置的确定源 - 这是C函数gethostname(2)。该函数也由programhostname调用。

#2 热门回答(86 赞)

InetAddress.getLocalHost().getHostName()是更便携的方式。

exec("hostname")实际调用操作系统来执行hostname命令。

以下是关于SO的其他几个相关答案:

Java当前计算机名称并登录用户?

获取远程计算机看到的本地计算机的DNS名称

**编辑:**你应该查看A.H.'s answer或Arnout Engelen's answer,详细了解为什么这可能无法按预期工作,具体取决于你的具体情况。作为这个特别要求携带的人的答案,我仍然认为很好,但他们提出了一些应该考虑的好点。

#3 热门回答(32 赞)

正如其他人所说,根据DNS解析获取主机名是不可靠的。

由于遗憾的是这个问题仍然存在于2018,我想与你分享我的网络独立解决方案,并在不同系统上进行一些测试。

以下代码尝试执行以下操作:

在Windows上通过System.getenv()读取COMPUTERNAME环境变量。执行hostname.exe并读取响应

在Linux上通过System.getenv读取HOSTNAME环境变量()执行主机名并读取响应读取/ etc / hostname(为此我执行cat,因为代码片段已包含要执行和读取的代码。只需读取文件即可但是更好)。

代码:

public static void main(String[] args) throws IOException {

String os = System.getProperty("os.name").toLowerCase();

if (os.contains("win")) {

System.out.println("Windows computer name through env:\"" + System.getenv("COMPUTERNAME") + "\"");

System.out.println("Windows computer name through exec:\"" + execReadToString("hostname") + "\"");

} else if (os.contains("nix") || os.contains("nux") || os.contains("mac os x")) {

System.out.println("Unix-like computer name through env:\"" + System.getenv("HOSTNAME") + "\"");

System.out.println("Unix-like computer name through exec:\"" + execReadToString("hostname") + "\"");

System.out.println("Unix-like computer name through /etc/hostname:\"" + execReadToString("cat /etc/hostname") + "\"");

}

}

public static String execReadToString(String execCommand) throws IOException {

try (Scanner s = new Scanner(Runtime.getRuntime().exec(execCommand).getInputStream()).useDelimiter("\\A")) {

return s.hasNext() ? s.next() : "";

}

}

不同操作系统的结果:

macOS 10.13.2

Unix-like computer name through env:"null"

Unix-like computer name through exec:"machinename

"

Unix-like computer name through /etc/hostname:""

OpenSuse 13.1

Unix-like computer name through env:"machinename"

Unix-like computer name through exec:"machinename

"

Unix-like computer name through /etc/hostname:""

Ubuntu 14.04 LTS这个有点奇怪自echo $HOSTNAME返回正确的主机名,但是System.getenv("HOSTNAME")不是:

Unix-like computer name through env:"null"

Unix-like computer name through exec:"machinename

"

Unix-like computer name through /etc/hostname:"machinename

"

**编辑:**如果你在执行Java代码之前运行export HOSTNAME,则根据legolas108,System.getenv("HOSTNAME")在Ubuntu 14.04上运行。

Windows 7

Windows computer name through env:"MACHINENAME"

Windows computer name through exec:"machinename

"

Windows 10

Windows computer name through env:"MACHINENAME"

Windows computer name through exec:"machinename

"

机器名称已被替换,但我保留了大写和结构。注意执行hostname时的额外换行符,在某些情况下可能需要考虑它。

java 获取主机名_建议在Java中获取主机名的方法相关推荐

  1. java url hostname_如何从URL字符串中提取主机名和端口?(How to extract hostname and port from URL string?)...

    如何从URL字符串中提取主机名和端口?(How to extract hostname and port from URL string?) 我需要从URL中提取主机名和端口(如果有的话),下面是我的 ...

  2. JAVA类思维_面向对象思维 Java中的类和对象及其应用

    一.面向过程与面向对象 面向过程: 从事务执行者的角度思考问题,我该干什么  重点在过程----事务流程 面向对象: 从事务的指挥者角度思考问题,我应该找谁干什么  重点在对象 面向对象的优点: 1. ...

  3. java实现递归算法_如何在Java中实现二进制搜索算法而无需递归

    java实现递归算法 by javinpaul 由javinpaul 流行的二进制搜索算法的迭代实现,用于在排序数组中查找元素. (An Iterative implementation of the ...

  4. java安卓计时器_如何在android中设置计时器

    通过java.util.Timer和java.util.TimerTask使用计时器的标准Java方法在Android中运行良好,但是你应该知道这个方法创建了一个新线程. 您可以考虑使用非常方便的Ha ...

  5. java cpu监控_如何在Java中监视计算机的CPU,内存和磁盘使用情况?

    问题 我想用Java监视以下系统信息: 当前CPU使用率**(百分比) 可用内存*(免费/总计) 可用磁盘空间(空闲/总计)*请注意,我的意思是整个系统可用的总内存,而不仅仅是JVM. 我正在寻找一种 ...

  6. java console 交互_实例讲解java中Console类的用法

    java的Console类的使用方法及实例 java的Console类的使用方法及实例 JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备.如果你的Java程序要与Win ...

  7. 不允许使用java方式启动_细品 Java 中启动线程的正确和错误方式

    细品 Java 中启动线程的正确和错误方式 前文回顾详细分析 Java 中实现多线程的方法有几种?(从本质上出发) start 方法和 run 方法的比较 代码演示:/** * * start() 和 ...

  8. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  9. java 添加注解_你知道Java中的package-info的作用吗?

    package-info.java对于日常业务开发的开发者来说,可能有点陌生,如果我们再项目中创建一个package-info.java,你会发现该类只有一个packge,如下 我们无法在该java文 ...

最新文章

  1. 重返学术界!​微软全球执行副总载沈向洋加盟清华大学!招收计算机视觉图形学博士生...
  2. MongoDB 2.5 版本将提供新的查询引擎
  3. 管理服务器一般的作用,管理服务器作用
  4. php导出大量excel表,php导出大量数据到excel时,有哪些比较好的处理方法?
  5. 查看oracle会话和进程_带有Oracle Digital Assistant和Fn Project的会话式UI
  6. error: Your local changes to the following files would be overwritten by merge:
  7. vscode中如何拉取git代码_工具 | 手把手教你在VSCode中使用Git
  8. c语言 怎么访问64位地址_大神用10000字总结了嵌入式C语言必学知识点……
  9. BZOJ3573: [Hnoi2014]米特运输(树上乱搞)
  10. c语言贪吃蛇积分用什么函数,C语言之贪吃蛇(curses库函数)
  11. mac上php的集成环境
  12. 微信个性化菜单 java_java_java微信开发API第四步 微信自定义个性化菜单实现,微信如何实现自定义个性化菜 - phpStudy...
  13. 【OpenCV】- 图像修复
  14. php-fpm 多核,linux 多核CPU性能调优
  15. ubuntu系统安装TIM,QQ,微信,迅雷,百度网盘
  16. 少儿编程Scratch学习教程3--帮助中心
  17. PADS Logic 元件绘制
  18. 北大青鸟毕业的程序员该何去何从
  19. [渝粤教育] 郑州工程技术学院 大学计算机基础 参考 资料
  20. NBA常规赛总助攻排行榜(数据截止至11年4月14日)

热门文章

  1. html input dropdown,选择下拉插件-Dropdown.js
  2. 反向传播与梯度下降详解
  3. Kate  一款功能丰富的文本编辑器(可能是目前最好的开源跨平台轻量编辑器 之一)
  4. 【Linux内幕】schedule_work基本流程
  5. 《Python数据分析与挖掘实战》第12章(下)——协同推荐
  6. java中的继承详解
  7. git文件一直提示modified之解决
  8. TCP的CLOSING状态发生条件
  9. Fedor and New Game
  10. uwsgi php,Nginx+uWSGI