Atitit.操做註冊表 樹形數據庫 註冊表的歷史 java版本類庫總結html
1. 註冊表是樹形數據庫 1java
2. 註冊表的由來 1node
3.1. 使用Preferences API (限定訪問路徑了) 2windows
3.2. 使用JNI 3this
3.4. Jregistry 4操作系統
4. org.openqa.selenium.os.WindowsUtils 4.net
樹形數據庫,但不提供相似SQL的查詢接口
在Windows 3.x操做系統中,註冊表是一個極小文件,其文件名爲Reg.dat,裏面只存放了某些文件類型的
應 用程序關聯,大部分的設置放在Win.ini、System.ini等多個初始化INI文件中。因爲這些初始化文件不便於管理和維護,時常出現一些因 INI文件遭到破壞而致使系統沒法啓動的問題。爲了使系統運行得更爲穩定、健壯,Windows 95/98設計師們借用了Windows NT中的註冊表的思想,將註冊表引入到Windows 95/98操做系統中,並且將INI文件中的大部分設置也移植到註冊表中,所以,註冊表在Windows 95/98操做系統的啓動、運行過程當中起着重要的做用。
做者:: 老哇的爪子 Attilax 艾龍, EMAIL:1466519819@qq.com
轉載請註明來源: http://blog.csdn.net/attilax
因爲java程序是「write once, run everywhere」,用java讀寫註冊表,那程序的跨平臺性就差了。java對註冊表的操做,在jdk1.4之前的版本中,那是不可能的,只能用 JNI來實現;然而jdk1.4以後提供的prefs包能夠操做windows註冊表,不過定死了root只在SOFTWARE/JavaSoft /prefs下,估計也是出於這種兩難吧,又要保證所謂平臺無關,還要照顧你們對windows的依賴
。而 JDK 提供操做 Windows 的 API 也就是 Preferences,由於這個 API 也是跨平臺的,所功能比較弱,在 Win32 下只能用來操做 HKCU\Software\JavaSoft 和 HKLM\Software\JavaSoft 下及子節點的數據。
自由訪問註冊表其餘鍵的值光用 Java 是作不到的,必然方案就是 JNI,
Preferences API並非爲訪問Windows註冊表而設計的,這是值得指出的一點。
咱們之因此會有上面的誤解是因爲Sun的Windows版本的JDK在實現Preferences API時使用了Windows註冊表做爲存儲庫,即咱們用Preferences API存儲的數據會保存到Windows註冊表中,這樣Preferenes API也就有了訪問Windows註冊表的能力。可是換到其它的平臺或其它廠商的JDK實現又會怎麼樣呢?這個問題是和Preferences API的實現相關的,咱們沒有辦法回答。
若是程序不關心存儲庫的細節,只是要找一個存放數據的地方,那麼Preferences API很合適。
Preferences API也是有侷限的,請您考慮兩個問題:
· 一個Java軟件,此次我在Sun的JDK上運行並使用Preferences API保存了個人我的喜愛,下次我在IBM的JDK上運行,這時個人我的喜愛還能夠經過Preferences API獲得嗎?可能能夠也可能不能夠,這時的行爲是由Sun和IBM的Preferences API實現決定的。(在相同的JDK實現上可使用Preferences API來在不一樣的程序間共享數據)
· 一個Java軟件須要讓用戶設置是否和操做系統一塊兒啓動,相似的需求還不少。這類需求就是要求Java程序有真正的和相關操做系統協同的能力。這種能力不是Preferences API的設計目標。
java讀寫註冊表須要用到兩種方式:
1. java.util.prefs.* 中的包
其中 Preferences.systemRoot() 獲得的是 HKEY_LOCAL_MACHINE/Software/JavaSoft/prefs 能夠在此位置之下方便的進行註冊表的 讀寫
Preferences.userRoot() 獲得的是 HKEY_LOCAL_USER/Software/JavaSoft/prefs,能夠在此位置下進行註冊表
可是對其餘
位置操做就不方便。
示例代碼:
import java.util.prefs.*;
public class Registery {
String[] keys = {"aaa", "bbb", "ccc"};
String[] values = {"1", "2", "3"};
//把相應的值儲存到變量中去
public void writeValue() {
// HKEY_LOCAL_MACHINE/Software/JavaSoft/prefs下寫入註冊表值.
Preferences pre = Preferences.systemRoot().node("/javaplayer");
for (int i = 0; i < keys.length; i++) {
pre.put(keys, values);
}
}
public static void main(String[] args) {
Registery reg = new Registery();
reg.writeValue();
}
}
執行代碼的結果會在 HKEY_LOCAL_MACHINE/Software/JavaSoft/prefs/javaplayer 位置插入三個鍵值
Windows操做系統提供了操做註冊表的API,所以用JNI將Java和這些API鏈接起來咱們就得到了用Java操做註冊表的能力。這提及來有些簡單,實現起來卻須要處理大量的細節。幸運的是這樣的工做已經有人作了,咱們要感謝他們。下面咱們就來看看其中的一個包。
com.ice.jni.registry包是經過JNI(Java native interface)實現的Windows註冊表操做API,能夠用來訪問、修改和導出Windows註冊表。如今這個包已經公開了,能夠放心的使用而不 必擔憂license的問題,而且包括一個構建好的DLL和Java、C的源代碼。它能夠在Java 1.1和更高的版本上工做。
2. 開源讀寫註冊表的庫 registry-3.1.3 主頁地址:http://www.trustice.com/java/jnireg/index.shtml
下載後須要將ICE_JNIRegistry.dll放到目前正在用的 jdk的bin目錄下
jRegistry經過JNI技術來訪問WINDOWS註冊表API。
writeIntRegistryValue
writeStringRegistryValue
runRegQuery
public static void main(String[] args) throws Exception {
Line 50: public static void traceWith(Logger log) {
Line 54: public static void killByName(String name) {
Line 58: public static void tryToKillByName(String name) {
Line 68: public static void kill(String[] cmdarray) throws Exception {
Line 126: private static void killPID(String processID) {
Line 131: public static Map<String, String> procMap() throws Exception {
Line 171: public static synchronized Properties loadEnvironment() {
Line 182: public static String getProgramFilesPath() {
Line 186: public static String getProgramFiles86Path() {
Line 190: private static String getEnvVarPath(String envVar, String defaultValue) {
Line 201: public static ImmutableList<String> getPathsInProgramFiles(String childPath) {
Line 207: private static String getFullPath(String parent, String child) {
Line 211: public static String getLocalAppDataPath() {
Line 220: public static String getEnvVarIgnoreCase(String var) {
Line 230: public static File findSystemRoot() {
Line 250: public static String findWMIC() {
Line 267: public static File findWBEM() {
Line 280: public static String findTaskKill() {
Line 295: public static String findReg() {
Line 319: public static boolean isRegExeVersion1() {
Line 330: public static Class<?> discoverRegistryKeyType(String key) {
Line 358: public static String readStringRegistryValue(String key) {
Line 384: public static int readIntRegistryValue(String key) {
Line 418: public static boolean readBooleanRegistryValue(String key) {
Line 431: public static boolean doesRegistryValueExist(String key) {
Line 452: public static void writeStringRegistryValue(String key, String data)
Line 477: private static String executeCommand(String commandName, String[] args) {
Line 489: public static void writeIntRegistryValue(String key, int data) {
Line 517: public static void writeBooleanRegistryValue(String key, boolean data) {
Line 521: public static void deleteRegistryValue(String key) {
Line 540: private static String runRegQuery(String key) {
Line 556: public static boolean thisIsWindows() {
Line 560: private static class RegKeyValue {
參考
Atitit.各類 數據類型 ( 樹形結構, ) 的結構與存儲數據庫 attilax 總結.doc