在 Java 應用開發、部署排查或跨平台適配時,經常需要讀取操作系統環境變量(如 PATH、JAVA_HOME)與JVM 系統屬性(如 java.version、user.dir)。本文提供兩種完整代碼方案:標準遍歷法與簡化單行代碼法,並附帶實際輸出示例,幫助你快速掌握核心 API。
| 類別 | 獲取方法 | 返回類型 | 典型用途 |
|---|---|---|---|
| 系統環境變量 | System.getenv() | Map<String, String> | PATH、OS、用戶主目錄等外部配置 |
| JVM 系統屬性 | System.getProperties() | Properties(繼承 Hashtable) | Java 版本、類路徑、文件編碼、工作目錄等內部運行參數 |
import java.util.*;
public class SystemInfoPrinter {
public static void main(String[] args) {
// 1. 打印系統環境變量
System.out.println("=== 系統環境變量 ===");
Map<String, String> envMap = System.getenv();
for (Map.Entry<String, String> entry : envMap.entrySet()) {
System.out.printf("%s = %s%n", entry.getKey(), entry.getValue());
}
System.out.println("\n=== JVM 系統屬性 ===");
// 2. 打印 JVM 系統屬性
Properties props = System.getProperties();
// 使用 Enumeration 遍歷(Properties 歷史遺留 API)
Enumeration<?> keys = props.propertyNames();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
System.out.printf("%s = %s%n", key, props.getProperty(key));
}
}
}
// 一行打印所有系統屬性
System.getProperties().list(System.out);
// 一行打印所有環境變量(Java 8+ Lambda)
System.getenv().forEach((k, v) -> System.out.println(k + " = " + v));
java.version / java.runtime.version:Java 版本號java.home:JRE 安裝目錄user.dir:當前工作目錄(相對路徑基準)user.home:當前用戶主目錄file.encoding:默認文件編碼(如 UTF-8、GBK)file.separator / path.separator / line.separator:跨平台路徑/路徑列表/換行符分隔符java.class.path:類加載路徑os.name / os.arch / os.version:操作系統信息PATH:可執行文件搜索路徑JAVA_HOME:JDK 安裝根目錄CLASSPATH:舊版類路徑(現多由 -cp 或 Manifest 指定)TEMP/TMP:臨時文件目錄USERNAME/USERDOMAIN:Windows 用戶/域信息File.separator 或 Paths.get() 代替硬編碼 "/" 或 "\\"。DB_URL、DB_USER、DB_PASS,避免硬編碼敏感信息。-Dkey=value 設置系統屬性,如 -Denv=prod,代碼中用 System.getProperty("env") 讀取。java.class.path 確認依賴包是否生效。System.getenv() 讀取。System.getenv() 在某些受限環境(如 Applet、SecurityManager 啟用)可能返回 null 或拋出異常,建議捕獲異常處理。System.setProperty() 修改,但環境變量不可修改(只讀)。掌握這兩組 API,能讓你的 Java 應用更靈活地適應部署環境,也能在排查「在我機器上能跑」類問題時快速定位環境差異。