 和System.getProperty())
在 Java 中System.getenv()和System.getProperty()是用于获取系统信息的两个常用方法但它们获取的信息来源、用途和作用范围有着本质的区别。1. 核心区别概述System.getenv()用于获取操作系统级别的环境变量Environment Variables。这些变量由操作系统设置对当前进程及其所有子进程可见。例如PATH、JAVA_HOME、HOME等。System.getProperty()用于获取Java 虚拟机JVM级别的系统属性System Properties。这些属性由 JVM 在启动时读取或设置主要用于描述 Java 运行时环境、操作系统信息或应用程序的自定义配置。例如os.name、java.version、user.dir等。2. 详细对比特性System.getenv()System.getProperty()信息来源操作系统OSJava 虚拟机JVM或应用程序作用范围全局对当前进程及所有子进程可见局部仅对当前 JVM 实例可见修改方式需在操作系统层面修改如修改注册表、环境变量配置可通过System.setProperty()在代码中修改或通过-D参数在启动时传入大小写敏感性取决于操作系统如 Windows 不敏感Unix/Linux 敏感键名始终大小写敏感典型用途外部系统接口要求如PATH、跨进程配置传递获取运行环境信息、应用自定义配置、跨平台开发适配3. 使用示例使用System.getenv()获取环境变量// 获取特定的环境变量如 JAVA_HOME String javaHome System.getenv(JAVA_HOME); // 获取所有环境变量返回一个不可修改的 Map MapString, String allEnv System.getenv(); for (Map.EntryString, String entry : allEnv.entrySet()) { System.out.println(entry.getKey() entry.getValue()); }使用System.getProperty()获取系统属性// 获取 JVM 或 OS 相关的内置属性 String osName System.getProperty(os.name); String javaVersion System.getProperty(java.version); String userDir System.getProperty(user.dir); // 获取自定义属性带默认值防止返回 null String appName System.getProperty(app.name, DefaultApp);4. 开发建议优先使用System.getProperty()官方建议尽可能使用系统属性因为它们的作用范围仅限于当前 Java 进程不容易产生意想不到的副作用。何时使用System.getenv()当需要全局效果如影响所有子进程或者外部系统接口强制要求使用环境变量如PATH时才应使用System.getenv()跨平台兼容提示获取用户主目录时推荐使用System.getProperty(user.home)而不是通过System.getenv(HOME)Linux/macOS或System.getenv(USERPROFILE)Windows因为前者更加可靠且无需处理操作系统的差异。不可混用System.getProperty()不能直接读取操作系统的环境变量除非你在启动 JVM 时通过-D参数手动将其传入。例如获取PATH必须用System.getenv(PATH)。