2012年9月11日 星期二

Java Preference

在 Java 執行時,有時會想要存放一些使用者的設定,但不知道要放在哪裡
Java 中提供了幾種方法來存放,根據 [1] 的解說,主要是透過 Preference 或者 JNDI。
兩者的比較可以參考 [1] 裡面的小標題 Comparing Preferences API to Other Mechanisms 的描述。

Java 中的 Preference 分為 System 和 User 兩種,可以參考官方文件 [2] 的描述。
根據 [2] 的說明,Preference 會建立兩個樹狀結構,一個給 System、一個給 User
每個作業系統的使用者都會有自己獨立的 User tree,而 System tree 則是所有使用者共用的。
在架構上,Preference 是用 tree - node 的結構來表示,每個 key 在 tree 當中是一個 node
在樹狀結構中的 root node 路徑為 ""(空字串)。

不過其實我的測試中我覺得他的架構長怎麼樣好像不是很重要 XD
直接來看看在 Windows 下他是如何存放的吧~。

對於 Preference 實際存放的位置,可以看看 [3] 的討論
根據原發問者問題底下的討論,Alex 說在他的 Windows 7 上面,Preference 存放位置為 Windows 註冊表中的以下幾個地方:
/HKEY_CURRENT_USER/Software/JavaSoft/Prefs/
/HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Prefs/
/HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/JavaSoft/Prefs/
以我的測試狀況來說,假設我指定的 Preference 的是 Main.java 這個檔案的 class
Main.java 的 package 是 a.b.c.d、設定的 key 是 language、使用的是 User Preference
則最後在 Windows 7 註冊表中產生的路徑是 /HKEY_CURRENT_USER/Software/JavaSoft/Prefs/a/b/c/d 資料夾內的 language 這組字串值。
(即測試出來跟 class 無關,只跟 class 所屬的 package 有關)

要把值放入 Preference 的方法如下:(假設使用 User tree,要放在 Main.java 的對應屬性裡)
String KEY_NAME = "key";
Preferences pref = Preferences.userNodeForPackage(Main.class);
pref.put(KEY_NAME, "put a value");

註:實際上一般狀況似乎 Java Application 也沒辦法對 System root 執行 put 指令
會跑出沒有足夠權限執行的 Exception。

從 Preference 取值的方法:
String KEY_NAME = "key";
Preferences pref = Preferences.userNodeForPackage(Main.class);
String response = pref.get(KEY_NAME, null);

參考資料:
1、Preferences API
2、java.util.prefs.Preferences
3、Where are Java preferences stored on Mac OS X?

沒有留言: