最稳妥的跨平台硬件信息获取方式是调用系统命令:windows 用 wmic 或 systeminfo,linux/macos 用 lshw、dmidecode 或 /proc/sys 文件;需注意权限、编码、超时、错误流及 fallback 机制。

用 Runtime.getRuntime().exec() 调 Windows/Linux 命令最直接
Java 本身不内置跨平台硬件信息 API,最稳妥的入门方式就是调系统命令。Windows 用 systeminfo、wmic,Linux/macOS 用 lshw、dmidecode、cat /proc/cpuinfo 等——前提是目标机器装了对应工具且有权限。
实操建议:
立即学习“Java免费学习笔记(深入)”;
-
Runtime.getRuntime().exec()比ProcessBuilder更轻量,适合单次简单命令;但注意它不解析 shell 语法(比如|、&&),想管道必须自己拼接或改用bash -c "..." - Windows 上
wmic已被微软标记为“过时”,但目前仍可用;systeminfo输出稳定但字段杂乱,需正则提取 - Linux 下
dmidecode需 root 权限,普通用户执行会静默失败或报错Cannot access the DMI table,别只看 exit code 0 就以为成功 - 务必设置超时(用
process.waitFor(5, TimeUnit.SECONDS)),避免lshw在某些虚拟机里卡死
解析 systeminfo 输出时别信“已安装的补丁”那行
Windows 的 systeminfo 表面信息全,实际关键字段不可靠。比如 “已安装的补丁” 列只显示 KB 编号,不含安装时间或状态;更严重的是,“处理器” 行常把多核 CPU 写成 “x64-based PC”,完全没型号和核心数。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 优先用
wmic cpu get Name,NumberOfCores,NumberOfLogicalProcessors拿 CPU 真实信息 -
systeminfo | findstr /C:"物理内存"在中文系统下才有效,英文系统得换"Total Physical Memory",硬编码字符串极易翻车 - 所有输出都用
process.getInputStream()读,别漏掉getErrorStream()——wmic报错时不走 stdout,错误信息在 stderr 里 - 字符编码必须显式指定:Windows 默认是
GBK,用new InputStreamReader(is, "GBK"),否则中文全变问号
lshw -short 和 -json 输出差异影响解析逻辑
Linux 下 lshw 是最接近“开箱即用”的工具,但输出格式选错会导致解析崩溃。-short 是树状文本,人眼友好但难写通用解析器;-json 结构清晰,但默认需要 root,且部分老版本不支持。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 非 root 用户可降级用
lshw -class system -class cpu -class memory -json,限制范围能绕过部分权限检查 -
-json输出含换行和缩进,别用readLine()一行行读,直接用IOUtils.toString(input, "UTF-8")整体读入再 JSON 解析 - 某些嵌入式 Linux(如 OpenWrt)压根没
lshw,得 fallback 到/proc/cpuinfo+/sys/class/dmi/id/组合读取,比如cat /sys/class/dmi/id/product_name - 注意
lshw -json在容器里可能返回空或报错not supported,得提前which lshw检查是否存在
跨平台判断 CPU 架构别只看 os.arch
System.getProperty("os.arch") 返回的是 JVM 启动时的架构(如 amd64),不是当前 CPU 真实能力。ARM64 机器上跑 x86_64 JVM,它就报 amd64;M1 Mac 跑 Rosetta JVM,照样报 x86_64。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 真实架构得靠系统命令反推:Linux 用
uname -m(返回aarch64或x86_64),Windows 用wmic os get OSArchitecture - 别依赖
os.name判断系统类型——某些国产 Linux 发行版返回的os.name是 “Linux”,但内核魔改导致/proc路径行为异常 - JVM 参数
-d64或-d32已废弃,不能作为依据;真正可靠的是System.getProperty("sun.arch.data.model"),但它只说位数(64),不说指令集 - 如果只要区分 Intel/AMD vs ARM,最稳是解析
lscpu输出里的Architecture:行或wmic cpu get Architecture(Windows 返回数字:9=ARM64,6=AMD64)
真正麻烦的从来不是怎么调命令,而是命令在不同环境里返回什么、不返回什么、为什么没返回——得挨个机器试,留好 fallback 路径,别指望一个命令打遍天下。










