Atitit.操做註冊表 樹形數據庫 註冊表的歷史 java版本類庫總結

Atitit.操做註冊表 樹形數據庫 註冊表的歷史 java版本類庫總結html

 

1. 註冊表是樹形數據庫 1java

2. 註冊表的由來 1node

3. Java  操做註冊表 2數據庫

3.1. 使用Preferences API (限定訪問路徑了) 2windows

3.2. 使用JNI 3this

3.3. Jregistrykey 推薦 4spa

3.4. Jregistry 4操作系統

4. org.openqa.selenium.os.WindowsUtils 4.net

4.1. 以及進程管理 4設計

 

1. 註冊表是樹形數據庫

樹形數據庫,但不提供相似SQL的查詢接口

 

 

2. 註冊表的由來

在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

 

3. Java  操做註冊表

3.1. 使用Preferences API (限定訪問路徑了)

因爲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註冊表而設計的,這是值得指出的一點。

咱們之因此會有上面的誤解是因爲SunWindows版本的JDK在實現Preferences API時使用了Windows註冊表做爲存儲庫,即咱們用Preferences API存儲的數據會保存到Windows註冊表中,這樣Preferenes API也就有了訪問Windows註冊表的能力。可是換到其它的平臺或其它廠商的JDK實現又會怎麼樣呢?這個問題是和Preferences API的實現相關的,咱們沒有辦法回答。 

若是程序不關心存儲庫的細節,只是要找一個存放數據的地方,那麼Preferences API很合適。

Preferences API也是有侷限的,請您考慮兩個問題: 

· 一個Java軟件,此次我在SunJDK上運行並使用Preferences API保存了個人我的喜愛,下次我在IBMJDK上運行,這時個人我的喜愛還能夠經過Preferences API獲得嗎?可能能夠也可能不能夠,這時的行爲是由SunIBMPreferences 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 位置插入三個鍵值

3.2. 使用JNI

Windows操做系統提供了操做註冊表的API,所以用JNIJava和這些API鏈接起來咱們就得到了用Java操做註冊表的能力。這提及來有些簡單,實現起來卻須要處理大量的細節。幸運的是這樣的工做已經有人作了,咱們要感謝他們。下面咱們就來看看其中的一個包。

com.ice.jni.registry包是經過JNI(Java native interface)實現的Windows註冊表操做API,能夠用來訪問、修改和導出Windows註冊表。如今這個包已經公開了,能夠放心的使用而不 必擔憂license的問題,而且包括一個構建好的DLLJavaC的源代碼。它能夠在Java 1.1和更高的版本上工做。 

 

2. 開源讀寫註冊表的庫 registry-3.1.3 主頁地址:http://www.trustice.com/java/jnireg/index.shtml
   下載後須要將ICE_JNIRegistry.dll放到目前正在用的 jdk的bin目錄下

3.3. Jregistrykey 推薦

3.4. Jregistry 

 jRegistry經過JNI技術來訪問WINDOWS註冊表API。

 

4. org.openqa.selenium.os.WindowsUtils

writeIntRegistryValue

writeStringRegistryValue

runRegQuery

 

4.1. 以及進程管理

 

 

  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

相關文章
相關標籤/搜索