首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 應用中獲取系統屬性的完整指南

     編輯:Java 相關知識

前言

Java 憑藉面向對象、跨平台、可移植性強、安全性高等優勢,已成為企業級應用開發的首選語言。在跨平台環境下運行 Java 應用時,往往需要動態獲取作業系統類型、JDK 版本、用戶工作目錄等隨環境變化的資訊,以確保程式正確執行。JDK 提供的 java.util.Properties 類(系統屬性類)讓這項工作變得輕而易舉。此外,開發者還可自訂屬性檔,於執行期動態載入以控制程式行為。本文將深入解析 Properties 類的核心方法、常見系統屬性鍵值、自訂屬性檔操作實戰,以及安全策略檔的定義與應用。

一、Properties 類核心方法速查

1. 獲取屬性

  • contains(Object value) / containsKey(Object key):判斷值或鍵是否存在,返回布林值。
  • getProperty(String key) / getProperty(String key, String defaultValue):根據鍵獲取值,支援預設值。
  • list(PrintStream out) / list(PrintWriter out):將屬性表輸出至指定流。
  • size():返回屬性鍵值對數量。

2. 設定屬性

  • put(Object key, Object value):新增或更新鍵值對。
  • remove(Object key):移除指定鍵。

二、常用系統屬性鍵值對照表

屬性鍵說明典型值範例
file.separator檔案分隔符Windows: \;Unix/Linux: /
user.home用戶主目錄C:\Users\Admin / /home/user
java.homeJRE 安裝目錄C:\Program Files\Java\jre1.8.0_301
java.ext.dirs擴展類庫目錄C:\Program Files\Java\jre1.8.0_301\lib\ext
os.name作業系統名稱Windows 10 / Linux
user.name用戶登入名稱admin
os.version作業系統版本10.0
path.separator路徑分隔符Windows: ;;Unix: :
user.dir當前工作目錄D:\JavaProject

三、實戰範例:列印所有系統屬性

import java.util.Properties;

public class GetSystemProperties {
    public static void main(String[] args) {
        // 取得系統屬性並建立 Properties 物件
        Properties props = new Properties(System.getProperties());
        // 輸出至標準輸出
        props.list(System.out);
        
        // 實務上可根據屬性決定執行邏輯,例如:
        String os = System.getProperty("os.name").toLowerCase();
        if (os.contains("win")) {
            // Windows 專屬邏輯
        } else if (os.contains("nix") || os.contains("nux")) {
            // Linux/Unix 專屬邏輯
        }
    }
}

執行後將在主控台列印完整屬性清單,開發者可據此撰寫跨平台相容邏輯。

四、自訂屬性檔操作實戰

屬性檔(.properties)是外部化配置的經典方式,適合存放不需重新編譯即可修改的參數(如功能開關、版本號、路徑等)。

範例:讀取、修改並儲存屬性檔

import java.io.*;
import java.util.Properties;

public class PropertyFileDemo {
    public static void main(String[] args) {
        Properties props = new Properties();
        FileInputStream fis = null;
        FileOutputStream fos = null;
        
        try {
            // 1. 載入既有屬性檔
            fis = new FileInputStream("config.properties");
            props.load(fis);
            
            // 2. 動態修改屬性(例如啟用某功能)
            props.setProperty("feature.enabled", "true");
            props.setProperty("last.modified", String.valueOf(System.currentTimeMillis()));
            
            // 3. 寫回新檔案(附加註釋)
            fos = new FileOutputStream("config_updated.properties");
            props.store(fos, "Updated by PropertyFileDemo at " + new java.util.Date());
            
            System.out.println("屬性檔更新完成!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 關閉流
            try { if (fis != null) fis.close(); } catch (IOException ignored) {}
            try { if (fos != null) fos.close(); } catch (IOException ignored) {}
        }
    }
}

配置檔範例 config.properties

# 應用配置
feature.enabled=false
version=1.0.0
data.dir=./data

輸出 config_updated.properties

# Updated by PropertyFileDemo at Mon Jan 15 10:30:45 CST 2024
feature.enabled=true
version=1.0.0
data.dir=./data
last.modified=1705285845123

透過此機制,運維人員無需修改程式碼即可調整應用行為,極大降低維護成本。

五、Java 安全策略檔詳解

Java 安全架構基於 java.security.Policy 實現程式碼級權限控制。策略檔分三級載入,優序遞增:

  1. 系統策略檔(${java.home}/lib/security/java.policy)
  2. 用戶策略檔(${user.home}/.java.policy)
  3. 自訂策略檔(啟動時以 -Djava.security.policy=... 指定)

典型策略檔範例

grant {
    // 允許讀取特定系統屬性
    permission java.util.PropertyPermission "user.dir", "read";
    permission java.util.PropertyPermission "user.home", "read";
    permission java.util.PropertyPermission "java.home", "read";
    permission java.util.PropertyPermission "java.class.path", "read";
    permission java.util.PropertyPermission "user.name", "read";
    
    // 允許網路連接(範例)
    // permission java.net.SocketPermission "example.com:80", "connect,resolve";
    
    // 允許檔案讀寫(範例)
    // permission java.io.FilePermission "/tmp/-", "read,write,delete";
};

關鍵點:

  • grant 區塊定義授予的權限集合;可加上 codeBase 或 signedBy 限定適用程式碼來源。
  • PropertyPermission 的第二參數為動作:read / write。
  • 生產環境建議採用最小權限原則,僅開放必要權限。

六、最佳實踐總結

  1. 善用系統屬性:撰寫跨平台程式時,避免硬編碼路徑分隔符、換行符等,改用 System.getProperty("file.separator") 等。
  2. 外部化配置:將環境差異參數(資料庫連線、第三方服務 URL、功能開關)放入 .properties 或 YAML 檔,啟動時載入。
  3. 屬性檔版本控管:將範本檔(config.properties.template)納入版控,正式環境由部署流程產生實際檔案。
  4. 安全策略最小化:僅授予應用必要權限,定期審查策略檔。
  5. 動態重載:長時間運行的服務可實作定時重載屬性檔機制(如使用 WatchService 監聽檔案變更),實現熱更新。

掌握系統屬性與自訂屬性檔的操作,是打造靈活、可維護、跨平台 Java 應用的關鍵基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved