




已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
使用Java操作注冊表 博客分類: Java JavaJNIJDK1 使用JDK的 Preferences類 有兩個局限性 A JDK1.4以及以后版本才有 B 只能操作注冊表中的固定部分 HKEY_LOCAL_MACHINESOFTWAREJavaSoftPrefs 2 通過 JNI 的 ICE_JNIRegistry.dll /java/jnireg/index.shtml JDK1.4下實現訪問WIN32注冊表 WindowsIBM數據結構編程.netJava語言就以其平臺獨立性而受到了許多編程者的選擇,如果讓它來操作注冊表的話,好像就失去了它的這個特點,然而在實際的編程中,有時候我們很需要在注冊表中存儲軟件的有關信息,以方便下次啟動的時候初始化或者檢查注冊信息(假設我們在windows平臺下)!那么究竟用java可以操作windows的注冊表嗎?從JDK1.4起提供了java.util.prefs包,其中有一個Preferences類,能幫助我們實現對系統(tǒng)注冊表進行操作,Preferences類在不同的平臺中有不同的實現方式。而在Windows平臺中,Preferences是將數據保存在注冊表中的,而在其它平臺中有的是存儲在文件中、目錄服務或數據庫中。但不管怎樣,都是通過相同的接口來使用的,程序員可以不管具體的存儲實現細節(jié)。 最后再說明幾點:1:你的節(jié)點的首字母不要大寫,不然在注冊表中的項前就加了一個“/”;2:注冊表中的值也可以導入到一個XML文件中,具體方法見有關文檔.3:如果把代碼中的Preferences pre = Preferences.systemRoot().node(/javaplayer); 換成Preferences pre = Preferences.userRoot().node(/javaplayer);則相應的 HKEY_LOCAL_MACHINE就成為HKEY_LOCAL_USER在Windows平臺中,用戶參數項在注冊表中的根節(jié)點是HKEY_CURRENT_USERSoftwareJavaSoftPrefs;系統(tǒng)參數項在注冊表中的根節(jié)點是 HKEY_LOCAL_MACHINESOFTWAREJavaSoftPrefs;而我們指定的節(jié)點路徑是位于這些根節(jié)點之下的。java不能直接任意操作windows注冊表,其中java.util.prefs中的Preferences類只可以操作部分注冊表,Preferences.systemRoot()獲得的根目錄不是注冊表的根目錄(eg:HKEY_CLASSES_ROOT),而是java自定義的一個系統(tǒng)目錄“/”(比如:可能“/”=HKEY_CURRENT_USERSoftwareJavaSoftPrefs)。下面的類可以實現在HKEY_CURRENT_USERSoftwareJavaSoftPrefs下添加一個項zzti和項的值,并將所添加的信息保存到zzti.xml文件中.import java.util.prefs.*;import java.io.*;class TestRegeditpublic static void main(String args)Preferences myNode=Preferences.userRoot().node(zzti);System.out.println(myNode.absolutePath();String keys=com,name,age;String values=IBM,gongshi,20;for(int i=0;ikeys.length;i+) myNode.put(keys,values);trymyNode.exportNode(new FileOutputStream(new File(zzti.xml);catch(Exception e) e.printStackTrace();/以下部分實現的是刪除注冊表中的一項/*try myNode.removeNode(); catch(BackingStoreException e) e.printStackTrace(); */為 Java 1.4 增加的 java.util.prefs 包,通過提供對特定于實現的注冊表(例如,Windows 平臺上的 Windows 注冊表)的訪問能力,使您能夠操作用戶首選項數據和配置數據。您是不是曾經需要保存程序的配置數據但卻不知應將數據存儲在哪里? 雖然您可以使用屬性文件或資源束獲取這些信息,但 Java 平臺從未指定過用于存儲這些文件的標準位置。JSR 10 出現后一切都變了,它為 Java 1.4 API 提供增加的 java.util.prefs 包。存儲機制是特定于實現的細節(jié),但程序員不必知道,也不必操心。對于 Windows 平臺,它的位置是在“Windows 注冊表”。 您雖然不能夠對注冊表自由控制,但您的確可以通過一個公共根節(jié)點訪問所有的應用程序。開始命名很恰當的 Preferences 類提供操作首選項的基本框架。這個類提供了一系列靜態(tài)和抽象方法來操作兩套首選項(其中一套是用戶首選項,另一套是系統(tǒng)首選項)中的其中一套。 使用靜態(tài)方法,您會得到一個特定于平臺的實現,就象 WindowsPreferences 類; 然后您可以使用由這個特定于平臺的實現實現的抽象方法來做這項工作。用包將程序的首選項分組是個好習慣,可以避免與其它應用程序的命名沖突。 當您查找 Preferences 對象時,只需傳遞包的名稱。在使用非靜態(tài)方法時, 您可以傳遞對自身的引用(this),程序將為您確定查找的是哪個包,如清單 1 所示。清單 1. 從非靜態(tài)方法獲取 Preferences 對象 Preferences userPrefs = Preferences.userNodeForPackage(this);Preferences sysPrefs = Preferences.systemNodeForPackage(this);但是,如果您使用的是靜態(tài)方法,您就必須得到根節(jié)點并自己提供包,如清單 2 所示。清單 2. 從靜態(tài)方法獲取 Preferences 對象 Preferences userPrefs = Preferences.userRoot().node(/net/zukowski/ibm);Preferences sysPrefs = Preferences.systemRoot().node(/net/zukowski/ibm);有了進行操作的節(jié)點后,您就可以輕松地設置、獲取、除去和轉儲設置選項。只要把 Preferences 對象當作一個大的鍵 值散列表(這個表把樹形結構中的鍵組織起來)。可它不是“集合框架”( Collections Framework)的部件,(關于“集合框架”的更多信息,請參閱參考資料)。作者:peter出處:論壇責任編輯: 方舟 2003-10-15 12:03 為Java 1.4增加的java.util.prefs包提供了注冊表的訪問能力寫數據我們將從討論如何存儲首選項開始。Preferences 類提供一系列 put() 方法,如下所示,用于存儲值。除支持基本的字符串之外,您還可以存儲布爾值、雙精度數、浮點數、整型數、長整型數和字節(jié)數組(考慮序列化)。助手方法采用適當的數據類型并執(zhí)行必要的轉換以便將數據存儲為字符串。put(String key, String value) putBoolean(String key, boolean value) putByteArray(String key, byte value) putDouble(String key, double value) putFloat(String key, float value) putInt(String key, int value) putLong(String key, long value)所有的 put() 方法都返回一個 void。如果存儲機制不可用,將拋出一個BackingStoreException。注意:一個特定首選項的鍵長度被限制為 Preferences.MAX_KEY_LENGTH(80)個字符,而它的值被限制為 Preferences.MAX_VALUE_LENGTH(8192)個字符。讀數據可通過下面所示的一系列 get() 方法獲取特定的首選項。與寫數據相似,每種受支持的數據類型,都有自己的與眾不同的方法。但與獲取數據時不同的是,在備用存儲不可用,或有些東西尚未保存時您必須提供缺省值。這要求您確保自己的程序至少要有合理的缺省設置選項。get(String key, String default) getBoolean(String key, boolean default) getByteArray(String key, byte default) getDouble(String key, double default) getFloat(String key, float default) getInt(String key, int default) getLong(String key, long default)如果您對首選項名稱不確定,您可以用 keys() 方法查找一列與節(jié)點相關聯(lián)的鍵。這個方法返回節(jié)點的 String。 除獲取和存儲個別首選項以及獲取一列關鍵字之外,您還可以用 clear()、remove() 和 removeNode() 除去節(jié)點和值。轉儲數據如果您想在系統(tǒng)提供的備用存儲器之外保存和恢復首選項,您可以在 XML 格式的文檔中執(zhí)行這些操作。您可以用 exportNode() 導出一個節(jié)點或用 exportSubtree() 導出整個子樹。信息以 UTF-8 格式存儲。然后,當您想恢復信息時,可使用 importPreferences() 方法。偵聽“好奇心會害死一只貓”,但如果您對弄清除首選項何時改變很感興趣,您可以注冊一個 NodeChangeListener 或 PreferenceChangeListener,而不考慮隨之而來的后果。NodeChangeListener 負責通知您節(jié)點被添加和除去的時間, 而 PreferenceChangeListener 告訴您值的變化。這些都緊跟著基本 JavaBeans 組件事件用 add/removeNodeChangeListener(NodeChangeListener) 和 add/removePreferenceChangeListener() 方法處理結構之后發(fā)生。基本上,您先實現偵聽器,然后注冊偵聽器,這樣您會發(fā)現將來的變化。作者:peter出處:論壇責任編輯: 方舟 2003-10-15 12:03 為Java 1.4增加的java.util.prefs包提供了注冊表的訪問能力完整的示例真的就這些。清單 3 為您提供了一個完整的示例來試驗新功能(也可從參考資料下載)。程序運行后會自己清除,所以如果您想在注冊表中找到值,請注釋掉程序尾部的清除代碼。清單 3. 完整的示例 package net.zukowski.ibm;import java.io.*;import java.util.prefs.*;public class Prefs public static void main(String args) String denominations = One, Two, Five, Ten, Twenty;String pictures = Washington, Jefferson, Lincoln, Hamilton, Jackson;NodeChangeListener nodeChangeListener = new NodeChangeListener() public void childAdded(NodeChangeEvent event) Preferences parent = event.getParent();Preferences child = event.getChild();System.out.println(() + has a new child +();public void childRemoved(NodeChangeEvent event) Preferences parent = event.getParent();Preferences child = event.getChild();System.out.println(() + lost a child +();PreferenceChangeListener preferenceChangeListener = new PreferenceChangeListener() public void preferenceChange(PreferenceChangeEvent event) String key = event.getKey();String value = event.getNewValue();Preferences node = event.getNode();System.out.println(() + now has a value of + value + for + key);/ Look up user rootPreferences prefs = Preferences.userRoot().node(/net/zukowski/ibm);/ Add listenersprefs.addNodeChangeListener(nodeChangeListener);prefs.addPreferenceChangeListener(preferenceChangeListener);/ Save a bunch of key-value pairsfor (int i=0, n=denominations.length; i n; i+) prefs.put(denominationsi, picturesi);/ Display all the entriestry String keys = prefs.keys();for (int i=0, n=keys.length; i n; i+) System.out.println(keysi + : + prefs.get(keysi, Unknown); catch (BackingStoreException e) System.err.println(Unable to read backing store: + e);/ Create childPreferences child = Preferences.userRoot().node(/net/zukowski/ibm/foo);/ Save to XML filetry FileOutputStream fos = new FileOutputStream(prefs.out);prefs.exportNode(fos); catch (Exception e) System.err.println(Unable to export nodes: + e);/ Clean uptry prefs.removeNode(); catch (BackingStoreException e) System.err.println(Unable to access backing store: + e);因為要往注冊表里存值,以前也一直沒有接觸過用程序去操作注冊表,所以找了一天的資料,算是搞明白了,用java操作注冊表還是不方便,不能讓鍵值大寫,不能改最根部的目錄實現代碼如下:Java代碼 1. packagebean; 2. importjava.util.prefs.Preferences; 3. 4. publicclassSystemDrawInvoicePrefsBean 5. 6. publicbooleanisSystemInvoiceInsertBegin(longinvoiceNumberBegin) 7. 8. booleanTrueOrFalse=false; 9. Stringkeys=fps;/這里不能大寫,一大寫注冊表里就會在大寫的字母前加個“/” 10. 11. longvalues=invoiceNumberBegin; 12. 13. /*建立一個位于userroot下的/zldzjc/FPS節(jié)點參數項*/14. Preferencesprefs=Preferences.userRoot().node(/zldzjc/fps);/同樣不能大寫 15. 16. /*儲存參數項*/17. for(inti=0;ikeys.length;i+) 18. 19. prefs.putLong(keysi,valuesi);/輸入的是StringString型的還是StringLong型,都行,隨意改 20. TrueOrFalse=true; 21. 22. returnTrueOrFalse; 23. 24. 25. 26. publicbooleanisSystemInvoiceInsertStop(longinvoiceNumberStop) 27. 28. booleanTrueOrFalse=false; 29. Stringkeys=fpz; 30. longvalues=invoiceNumberStop; 31. 32. /*建立一個位于userroot下的/zldzjc/FPS節(jié)點參數項*/33. Preferencesprefs=Preferences.userRoot().node(/zldzjc/fpz); 34. 35. /*儲存參數項*/36. for(inti=0;ikeys.length;i+) 37. 38. prefs.putLong(keysi,valuesi); 39. TrueOrFalse=true; 40. 41. returnTrueOrFalse; 42. 43. 44. /*導出到XML文件*/45. /try 46. / 47. /FileOutputStreamfos=newFileOutputStream(prefs.xml);/可以把實現的功能存儲到xml里 48. /prefs.exportNode(fos); 49. / 50. /catch(Exceptione) 51. / 52. /System.err.println(Cannotexportnodes:+e); 53. / 54. 55. /*去掉注釋可以清除注冊表中的參數項*/56. /*try 57. 58. prefsdemo.removeNode(); 59. 60. catch(BackingStoreExceptione) 61. 62. */ 63. package bean;import java.util.prefs.Preferences;public class SystemDrawInvoicePrefsBean public boolean isSystemInvoiceInsertBegin(long invoiceNumberBegin) boolean TrueOrFalse = false ; String keys = fps;/這里不能大寫,一大寫注冊表里就會在大寫的字母前加個“/” long values = invoiceNumberBegin; /* 建立一個位于user root下的/zldzjc/FPS節(jié)點參數項*/ Preferences prefs = Preferences.userRoot().node(/zldzjc/fps);/同樣不能大寫 /* 儲存參數項*/ for (int i=0 ; i keys.length; i+) prefs.putLong(keysi, valuesi);/輸入 的是String String型的還是String Long型,都行,隨意改 TrueOrFalse = true ; return TrueOrFalse ; public boolean isSystemInvoiceInsertStop(long invoiceNumberStop) boolean TrueOrFalse = false ; String keys = fpz; long values = invoiceNumberStop; /* 建立一個位于user root下的/zldzjc/FPS節(jié)點參數項*/ Preferences prefs = Preferences.userRoot().node(/zldzjc/fpz); /* 儲存參數項*/ for (int i=0 ; i keys.length; i+) prefs.putLong(keysi, valuesi); TrueOrFalse = true ; return TrueOrFalse ; /* 導出到XML文件 */ try/ / FileOutputStream fos = new FileOutputStream(prefs.xml);/可以把實現的功能存儲到xml里/ prefs.exportNode(fos);/ / catch (Exception e)/ / System.err.println(Cannot export nodes: + e);/ /* 去掉注釋可以清除注冊表中的參數項*/ /*try prefsdemo.removeNode(); catch (BackingStoreException e) */ 由于java程序是“write once, run everywhere”,用java讀寫注冊表,那程序的跨平臺性就差了。java對注冊表的操作,在jdk1.4以前的版本中,那是不可能的,只能用JNI來實現;然而jdk1.4之后提供的prefs包可以操作windows注冊表,不過定死了root只在SOFTWARE/JavaSoft/prefs下,估計也是出于這種兩難吧,又要保證所謂平臺無關,還要照顧大家對windows的依賴。下面將從兩方面來介紹對注冊表的操作。一、使用JDK提供的Preferences類首先得到Preferences的一個對象,這個對象就規(guī)定了你要在注冊表的哪個位置寫入信息,即節(jié)點.然后再用put(String key,String value)或者putInt(),tDouble().等來給有關項賦值。下面是Demo程序。Java代碼 1. importjava.util.prefs.*; 2. publicclassRegistery 3. Stringkeys=version,initial,creator; 4. Stringvalues=1.3,ini.mp3,; 5. /把相應的值儲存到變量中去 6. publicvoidwriteValue() 7. /HKEY_LOCAL_MACHINESoftwareJavaSoftprefs下寫入注冊表值. 8. Preferencespre=Preferences.systemRoot().node(/javaplayer); 9. for(inti=0;ikeys.length;i+) 10. pre.put(keys,values); 11. 12. 13. publicstaticvoidmain(Stringargs) 14. Registeryreg=newRegistery(); 15. reg.writeValue(); 16. 17. import java.util.prefs.*;public class Registery String keys = version, initial, creator; String values = 1.3, ini.mp3, ; /把相應的值儲存到變量中去 public void writeValue() / HKEY_LOCAL_MACHINESoftwareJavaSoftprefs下寫入注冊表值. Preferences pre = Preferences.systemRoot().node(/javaplayer); for (int i = 0; i Project Properties-Required Libraries中添加jRegistryKey.jar或在環(huán)境變量classpath中添加該jar文件;2、將jRegistryKey.dll放在工程的當前目錄下;3、在訪問注冊表類中import該語句:import ca.beq.util.win32.registry.*; 該包中有兩個類:RegistryKey和RegistryValue。其中RegistryKey是注冊表鍵的java表示,它提供了creat()和delete()方法創(chuàng)建和刪除key,枚舉子鍵和值,set和get鍵的值等;RegistryValue is the Java? representation of a registry value (defined as a name, a type, and data).4、創(chuàng)建一個新key: Java代碼 1. RegistryKeyr=newRegistryKey(RootKey.HKEY_CURRENT_USER,SoftwareBEQTechnologies); 2. r.create();RegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER, SoftwareBEQ Technologies);r.create();5、創(chuàng)建一個子鍵:Java代碼 1. RegistryKeyr=newRegistryKey(RootKey.HKEY_CURRENT_USER,Software); 2. r.createSubkey(BEQTechnologies);RegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER, Software);r.createSubkey(BEQ Technologies);6、刪除一個已存在的鍵值:try RegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER, SoftwareBEQ Technologies); r.delete(); / trycatch(RegistryException re) re.printStackTrace(); / catch7、枚舉子鍵:Java代碼 1. RegistryKeyr=newRegistryKey(RootKey.HKEY_CURRENT_USER,Software); 2. if(r.hasSubkeys() 3. Iteratori=r.subkeys(); 4. while(i.hasNext() 5. RegistryKeyx=(RegistryKey)i.next(); 6. System.out.println(x.toString(); 7. /while 8. /ifRegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER, Software);if(r.hasSubkeys() Iterator i = r.subkeys(); while(i.hasNext() RegistryKey x = (RegistryKey)i.next(); System.out.println(x.toString(); / while / if8、讀注冊表中鍵的值:Java代碼 1. RegistryKeyr=newRegistryKey(RootKey.HKEY_CURRENT_USER,SoftwareBEQTechnologies); 2. if(r.hasValue(myValue) 3. RegistryValuev=r.getValue(myValue); 4. System.out.println(v.toString();/ 5. /ifRegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER, SoftwareBEQ Technologies);if(r.hasValue(myValue) RegistryValue v = r.getValue(myValue); System.out.println(v.toString();/ / if注:v.toString()僅是鍵myValue對應的鍵值,若要得到myValue鍵對應的值數據,則需要String str = v.getDate().toSting();9、設置注冊表中鍵的值:Java代碼 1. RegistryKeyr=newRegistryKey(RootKey.HKEY_CURRENT_USER,SoftwareBEQTechnologies); 2. RegistryValuev=newRegistryValue(myVal,ValueType.REG_SZ,data); 3. r.setValue(v);RegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER, SoftwareBEQ Technologies);RegistryValue v = new RegistryValue(myVal, ValueType.REG_SZ, data);r.setValue(v);10、枚舉某鍵的所有值:Java代碼 1. RegistryKeyr=newRegistryKey(RootKey.HKEY_CURRENT_USER,Software); 2. if(r.hasValues() 3. Iteratori=r.values(); 4. while(i.hasNext() 5. RegistryV
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 資源重組對經濟發(fā)展的推動作用試題及答案
- 北京市石景山區(qū)2025屆高三一??荚嚁祵W試題 含解析
- 2025屆江蘇省南京市、鹽城市高三下學期3月一模政治試題 含解析
- 公司火災撲救應急預案(3篇)
- 計算機考試備考工具試題及答案
- 森林火災應急撲救預案(3篇)
- 2025年國際市場中的戰(zhàn)略風險分析試題及答案
- 開源社區(qū)參與與貢獻試題及答案
- 消防火災應急預案是什么(3篇)
- 行政法學考試難點試題及答案揭秘
- 污水處理管理規(guī)章制度
- 手術記錄書寫規(guī)范
- 急性胃腸炎的健康宣教
- 室外消防鋼絲網骨架塑料復合PE管施工方案
- 2025年工會知識競賽題庫200題及答案(完整版)
- 完整版高中古詩文必背72篇【原文+注音+翻譯】
- 藥房考試試題及答案
- 2025年廣東省廣州南沙經濟技術開發(fā)區(qū)商務局招聘編外1人歷年自考難、易點模擬試卷(共500題附帶答案詳解)
- 飲水安全保障體系-深度研究
- 丙肝有關的考試題及答案
- 2025起重工(技師)技能鑒定精練考試指導題庫及答案(濃縮300題)
評論
0/150
提交評論