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

JDK 1.4 Preferences API 實戰:跨平台配置存儲與 Windows 註冊表訪問

     編輯:Java 相關知識

背景痛點

傳統 Java 缺乏標準配置存儲位置:Properties 檔放哪?如何跨平台?JSR 10 引入 java.util.prefs 徹底解決:

  • Windows → 註冊表(HKEY_CURRENT_USER\Software\JavaSoft\Prefs)
  • Linux/Unix → ~/.java/.userPrefs 目錄
  • 開發者無需關心底層存儲細節,統一 API 操作。

核心類:Preferences

兩棵獨立樹:

  • User Preferences:用戶級配置(預設)。
  • System Preferences:系統級配置(需管理員權限)。

獲取節點


// 非靜態方法:自動推導包名
Preferences userPrefs = Preferences.userNodeForPackage(this.getClass());
Preferences sysPrefs = Preferences.systemNodeForPackage(this.getClass());

// 靜態方法:手動指定絕對路徑
Preferences userPrefs = Preferences.userRoot().node("/com/myapp/config");
Preferences sysPrefs = Preferences.systemRoot().node("/com/myapp/config");

最佳實踐:以包名作為節點路徑前綴,避免命名衝突。

數據讀寫:類型安全的 Key-Value 存儲

數據類型寫入方法讀取方法(需默認值)
Stringput(key, value)get(key, default)
booleanputBoolean(key, value)getBoolean(key, default)
intputInt(key, value)getInt(key, default)
longputLong(key, value)getLong(key, default)
floatputFloat(key, value)getFloat(key, default)
doubleputDouble(key, value)getDouble(key, default)
byte[]putByteArray(key, value)getByteArray(key, default)

限制:Key 長度 ≤ 80,Value 長度 ≤ 8192。底層統一轉為字串存儲。

異常:存儲不可用拋 BackingStoreException。

進階功能

鍵值枚舉與清理


String[] keys = prefs.keys(); // 獲取所有鍵
prefs.remove(key); // 刪除單個鍵值
prefs.clear(); // 清空當前節點
prefs.removeNode(); // 刪除整個節點子樹

XML 匯出/匯入:備份與遷移


// 匯出單節點
prefs.exportNode(outputStream);
// 匯出整棵子樹
prefs.exportSubtree(outputStream);
// 匯入(靜態方法)
Preferences.importPreferences(inputStream);

格式:UTF-8 編碼 XML,適合版本控制、跨機器部署。

變更監聽:響應式配置


// 節點增減監聽
prefs.addNodeChangeListener(new NodeChangeListener() {
    public void childAdded(NodeChangeEvent e) { ... }
    public void childRemoved(NodeChangeEvent e) { ... }
});

// 鍵值變更監聽
prefs.addPreferenceChangeListener(new PreferenceChangeListener() {
    public void preferenceChange(PreferenceChangeEvent e) {
        String key = e.getKey(), val = e.getNewValue();
        // 熱加載配置、刷新 UI 等
    }
});

符合 JavaBeans 事件模型,支援動態配置更新。

完整範例:PrefsDemo.java


package net.zukowski.ibm;
import java.io.*; import java.util.prefs.*;

public class PrefsDemo {
    public static void main(String[] args) {
        String[] den = {"One","Two","Five","Ten","Twenty"};
        String[] pic = {"Washington","Jefferson","Lincoln","Hamilton","Jackson"};

        // 監聽器
        NodeChangeListener ncl = new NodeChangeListener() {
            public void childAdded(NodeChangeEvent e) {
                System.out.println(e.getParent().name() + " added child " + e.getChild().name());
            }
            public void childRemoved(NodeChangeEvent e) {
                System.out.println(e.getParent().name() + " removed child " + e.getChild().name());
            }
        };
        PreferenceChangeListener pcl = new PreferenceChangeListener() {
            public void preferenceChange(PreferenceChangeEvent e) {
                System.out.println(e.getNode().name() + " key=" + e.getKey() + " newVal=" + e.getNewValue());
            }
        };

        Preferences prefs = Preferences.userRoot().node("/net/zukowski/ibm");
        prefs.addNodeChangeListener(ncl);
        prefs.addPreferenceChangeListener(pcl);

        // 寫入
        for (int i=0; i

關鍵總結

  • 零配置跨平台:同一套代碼,Windows 寫註冊表,Linux 寫檔案。
  • 類型安全 API:避免手工字串解析錯誤。
  • 分層節點:天然支援模組化配置結構。
  • 監聽機制:實現配置熱加載、UI 即時同步。
  • XML 序列化:便於備份、部署、版本控制。
注意:Preferences 不適合存儲大量業務數據、高併發寫入場景,請改用資料庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved