中文 => English   |   English => 中文
          posts - 12, comments - 2, trackbacks - 0, articles - 0
             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          java 之 注冊表操作篇

          Posted on 2008-09-20 10:32 牛X書記 閱讀(7074) 評論(1)  編輯  收藏 所屬分類: java API

          使用Preferences API    參考資料

                  Preferences的誤解
                   首先要指明的是:Preferences API并不是為訪問Windows注冊表而設計的。

                  我們之所以會有上面的誤解是由于Sun的Windows版本的JDK在實現Preferences API時使用了Windows注冊表作為存儲庫,即我們用Preferences API存儲的數據會保存到Windows注冊表中,這樣Preferenes API也就有了訪問Windows注冊表的能力。但是換到其它的平臺或其它廠商的JDK實現又會怎么樣呢?這個問題是和Preferences API的實現相關的,我們沒有辦法回答。

                  Preferences適用的條件
                        如果程序不關心存儲庫的細節,只是要找一個存放數據的地方,那么Preferences API很合適。

                  Preferences API的局限:
                  一個Java軟件,這次我在Sun的JDK上運行并使用Preferences API保存了我的個人喜好,下次我在IBM的JDK上運行,這時我的個人喜好還可以通過Preferences API得到嗎?可能可以也可能不可以,這時的行為是由Sun和IBM的Preferences API實現決定的。(在相同的JDK實現上可以使用Preferences API來在不同的程序間共享數據)
                  一個Java軟件需要讓用戶設置是否和操作系統一起啟動,類似的需求還很多。這類需求就是要求Java程序有真正的和相關操作系統協同的能力。這種能力不是Preferences API的設計目標。

          使用JNI    參考資料
                  Windows操作系統提供了操作注冊表的API,因此用JNI將Java和這些API連接起來我們就獲得了用Java操作注冊表的能力。這說起來有些簡單,實現起來卻需要處理大量的細節。幸運的是這樣的工作已經有人做了,我們要感謝他們。下面我們就來看看其中的一個包。

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



          下面詳細的描述一下這個包中的類,數量不是很多:

          • HexNumberFormat 用來格式化和分析十六進制整數。
          • RegBinaryValue 表示類型為REG_BINARY的注冊表值。REG_BINARY是指任意形式的二進制數。
          • RegDWordValue 表示類型為REG_DWORD的注冊表值。REG_DWORD是指一個32位的整數。根據該整數的字節序不同又分為REG_DWORD_LITTLE_ENDIAN和REG_DWORD_BIG_ENDIAN。在Windows中REG_DWORD和REG_DWORD_LITTLE_ENDIAN有相同的含義。
          • RegistryValue 表示任意類型的注冊表值,這是一個抽象類,不能被實例化。
          • RegMultiStringValue 表示類型為REG_MULTI_SZ的注冊表值。REG_MULTI_SZ是一個null-terminated的字符串的序列。
          • RegStringValue 表示類型為REG_SZ和REG_EXPAND_SZ的注冊表值。REG_SZ是指一個null-terminated的字符串,REG_EXPAND_SZ是指一個含有未展開的環境變量的null-terminated的字符串。
          • Registry 這個類定義了定級項(Key),包括HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG、HKEY_CURRENT_USER、HKEY_DYN_DATA、HKEY_LOCAL_MACHINE、HKEY_PERFORMANCE_DATA和HKEY_USERS。還定義了錯誤代碼,這些錯誤代碼會包含在RegistryException中。最后是一些工具方法,如dumpHexData、exportRegistryKey、getErrorMessage、getTopLevelKey、openSubkey、parseArgumentString、parseArgumentVector、splitString和usage。
          • RegistryKey 定義了注冊表的一個表項(Key)和相關的一些操作。

          RegistryKey的方法概要:

          方法 簡短描述
          void closeKey() 關閉該subkey。
          RegistryKey connectRegistry(java.lang.String hostName) 連接遠程主機hostName的注冊表。
          RegistryKey createSubKey(java.lang.String subkey, java.lang.String className) 創建和打開該key的subkey,具有寫權限。
          RegistryKey createSubKey(java.lang.String subKey, java.lang.String className, int access) 創建和打開該key的subkey,具有指定的權限。
          int decrDoubleWord(java.lang.String valueName) 該方法將消減REG_DWORD的值。
          void deleteSubKey(java.lang.String subKey) 刪除該subkey。
          void deleteValue(java.lang.String valueName) 刪除一個命名的值。
          static java.lang.String expandEnvStrings(java.lang.String exString) 展開exString中的環境變量。
          void export(java.io.PrintWriter out, boolean descend) 導出key。
          void finalize() 重載了的finalize()方法,確保能夠關閉key。
          void flushKey() 確保這個key被寫到磁盤,對性能有一定的影響。
          java.lang.String getDefaultValue() 得到該key的默認值。
          java.lang.String getFullName() 得到key的全名。
          int getMaxSubkeyLength() 得到所有subkey名稱的最大長度。
          int getMaxValueDataLength() 得到所有subkey值的最大長度。
          int getMaxValueNameLength() 得到所有值的名稱的最大長度。
          java.lang.String getName() 得到該key的名稱。
          int getNumberSubkeys() 得到subkey的數量。
          int getNumberValues() 得到值的數量。
          java.lang.String getStringValue(java.lang.String valueName) 得到REG_SZ或REG_EXPAND_SZ的值。
          RegistryValue getValue(java.lang.String valueName) 得到valueName的值。
          boolean hasDefaultValue() 判斷該key是否有默認值。
          boolean hasOnlyDefaultValue() 判斷該key是否只有默認值。
          int incrDoubleWord(java.lang.String valueName) 該方法將增強REG_DWORD的值。
          java.util.Enumeration keyElements() 枚舉該key的subkey的名稱。
          RegistryKey openSubKey(java.lang.String subkey) 打開該key的subkey,具有寫權限。
          RegistryKey openSubKey(java.lang.String subKey, int access) 打開該key的subkey,具有指定的權限。
          java.lang.String regEnumKey(int index) 得到該key在index處的subkey。
          java.lang.String regEnumValue(int index) 得到該key在index處的subkey的值。
          void setCreated(boolean created) 設置該key的created狀態。
          void setValue(RegistryValue value) 設置該key的值。
          void setValue(java.lang.String valueName, RegistryValue value) 設置valueName的值。
          java.util.Enumeration valueElements() 枚舉該key的值的名稱。
          boolean wasCreated() 判斷該key是被opened還是被created和opened。



          最后我們來看一個代碼示例:

          package org.solol.test;
          import com.ice.jni.registry.NoSuchKeyException;
          import com.ice.jni.registry.RegStringValue;
          import com.ice.jni.registry.Registry;
          import com.ice.jni.registry.RegistryException;
          import com.ice.jni.registry.RegistryKey;
          /**
          * @author solo L
          *
          */
          public class JNIRegistryTest {
               /**
                * @param args
                */
               public static void main(String[] args) {
                 //創建注冊表項并設置相應的值
                 try {
                   RegistryKey software = Registry.HKEY_LOCAL_MACHINE
                     .openSubKey("SOFTWARE");
                   RegistryKey subKey = software.createSubKey("SubKeyName", "");
                   subKey.setValue(new RegStringValue(subKey, "subKey1",
                     "subKey1Value"));
                   subKey.setValue(new RegStringValue(subKey, "subKey2",
                     "subKey2Value"));
                   subKey.closeKey();
                 } catch (NoSuchKeyException e) {
                   e.printStackTrace();
                 } catch (RegistryException e) {
                   e.printStackTrace();
                 }
                            
                 //打開注冊表項并讀出相應的值
                 try {
                   RegistryKey software = Registry.HKEY_LOCAL_MACHINE.
                     openSubKey("SOFTWARE");
                   RegistryKey subKey = software.openSubKey("SubKeyName");
                   String subKey1Value = subKey.getStringValue("subKey1");
                   String subKey2Value = subKey.getStringValue("subKey2");
                   System.out.println(subKey1Value);
                   System.out.println(subKey2Value);
                   subKey.closeKey();
                 } catch (NoSuchKeyException e) {
                   e.printStackTrace();
                 } catch (RegistryException e) {
                   e.printStackTrace();
                 }                     
               }
          }
          
          創建的注冊表項如圖所示:

          輸出結果為:

          subKey1Value

          subKey2Value



          說明:我的體會“第一步:把下載下來的jar包加載到工程內,第二步,把與jar包在一起的dll文件拷貝到你jdk安裝目錄下\jre\bin文件夾下”


          評論

          # re: java 之 注冊表操作篇  回復  更多評論   

          2011-04-12 10:37 by qwq
          好!

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 徐州市| 独山县| 东丽区| 日照市| 钦州市| 阿拉善盟| 磴口县| 嘉义市| 三明市| 菏泽市| 惠水县| 大关县| 玉门市| 华蓥市| 双牌县| 招远市| 上虞市| 乐东| 丹凤县| 名山县| 济源市| 凤台县| 太保市| 台江县| 襄城县| 望奎县| 祁连县| 安龙县| 新平| 黄梅县| 河西区| 确山县| 都兰县| 侯马市| 南靖县| 即墨市| 金乡县| 城口县| 西畴县| 泾川县| 马龙县|