




已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
使用Java操作注冊表 博客分類: Java JavaJNIJDK1 使用JDK的 Preferences類 有兩個局限性 A JDK1.4以及以后版本才有 B 只能操作注冊表中的固定部分 HKEY_LOCAL_MACHINESOFTWAREJavaSoftPrefs 2 通過 JNI 的 ICE_JNIRegistry.dll /java/jnireg/index.shtml JDK1.4下實現(xiàn)訪問WIN32注冊表 WindowsIBM數(shù)據(jù)結(jié)構(gòu)編程.netJava語言就以其平臺獨立性而受到了許多編程者的選擇,如果讓它來操作注冊表的話,好像就失去了它的這個特點,然而在實際的編程中,有時候我們很需要在注冊表中存儲軟件的有關(guān)信息,以方便下次啟動的時候初始化或者檢查注冊信息(假設(shè)我們在windows平臺下)!那么究竟用java可以操作windows的注冊表嗎?從JDK1.4起提供了java.util.prefs包,其中有一個Preferences類,能幫助我們實現(xiàn)對系統(tǒng)注冊表進行操作,Preferences類在不同的平臺中有不同的實現(xiàn)方式。而在Windows平臺中,Preferences是將數(shù)據(jù)保存在注冊表中的,而在其它平臺中有的是存儲在文件中、目錄服務(wù)或數(shù)據(jù)庫中。但不管怎樣,都是通過相同的接口來使用的,程序員可以不管具體的存儲實現(xiàn)細節(jié)。 最后再說明幾點:1:你的節(jié)點的首字母不要大寫,不然在注冊表中的項前就加了一個“/”;2:注冊表中的值也可以導(dǎo)入到一個XML文件中,具體方法見有關(guān)文檔.3:如果把代碼中的Preferences pre = Preferences.systemRoot().node(/javaplayer); 換成Preferences pre = Preferences.userRoot().node(/javaplayer);則相應(yīng)的 HKEY_LOCAL_MACHINE就成為HKEY_LOCAL_USER在Windows平臺中,用戶參數(shù)項在注冊表中的根節(jié)點是HKEY_CURRENT_USERSoftwareJavaSoftPrefs;系統(tǒng)參數(shù)項在注冊表中的根節(jié)點是 HKEY_LOCAL_MACHINESOFTWAREJavaSoftPrefs;而我們指定的節(jié)點路徑是位于這些根節(jié)點之下的。java不能直接任意操作windows注冊表,其中java.util.prefs中的Preferences類只可以操作部分注冊表,Preferences.systemRoot()獲得的根目錄不是注冊表的根目錄(eg:HKEY_CLASSES_ROOT),而是java自定義的一個系統(tǒng)目錄“/”(比如:可能“/”=HKEY_CURRENT_USERSoftwareJavaSoftPrefs)。下面的類可以實現(xiàn)在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();/以下部分實現(xiàn)的是刪除注冊表中的一項/*try myNode.removeNode(); catch(BackingStoreException e) e.printStackTrace(); */為 Java 1.4 增加的 java.util.prefs 包,通過提供對特定于實現(xiàn)的注冊表(例如,Windows 平臺上的 Windows 注冊表)的訪問能力,使您能夠操作用戶首選項數(shù)據(jù)和配置數(shù)據(jù)。您是不是曾經(jīng)需要保存程序的配置數(shù)據(jù)但卻不知應(yīng)將數(shù)據(jù)存儲在哪里? 雖然您可以使用屬性文件或資源束獲取這些信息,但 Java 平臺從未指定過用于存儲這些文件的標準位置。JSR 10 出現(xiàn)后一切都變了,它為 Java 1.4 API 提供增加的 java.util.prefs 包。存儲機制是特定于實現(xiàn)的細節(jié),但程序員不必知道,也不必操心。對于 Windows 平臺,它的位置是在“Windows 注冊表”。 您雖然不能夠?qū)ψ员碜杂煽刂?,但您的確可以通過一個公共根節(jié)點訪問所有的應(yīng)用程序。開始命名很恰當?shù)?Preferences 類提供操作首選項的基本框架。這個類提供了一系列靜態(tài)和抽象方法來操作兩套首選項(其中一套是用戶首選項,另一套是系統(tǒng)首選項)中的其中一套。 使用靜態(tài)方法,您會得到一個特定于平臺的實現(xiàn),就象 WindowsPreferences 類; 然后您可以使用由這個特定于平臺的實現(xiàn)實現(xiàn)的抽象方法來做這項工作。用包將程序的首選項分組是個好習(xí)慣,可以避免與其它應(yīng)用程序的命名沖突。 當您查找 Preferences 對象時,只需傳遞包的名稱。在使用非靜態(tài)方法時, 您可以傳遞對自身的引用(this),程序?qū)槟_定查找的是哪個包,如清單 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é)點后,您就可以輕松地設(shè)置、獲取、除去和轉(zhuǎn)儲設(shè)置選項。只要把 Preferences 對象當作一個大的鍵 值散列表(這個表把樹形結(jié)構(gòu)中的鍵組織起來)。可它不是“集合框架”( Collections Framework)的部件,(關(guān)于“集合框架”的更多信息,請參閱參考資料)。作者:peter出處:論壇責(zé)任編輯: 方舟 2003-10-15 12:03 為Java 1.4增加的java.util.prefs包提供了注冊表的訪問能力寫數(shù)據(jù)我們將從討論如何存儲首選項開始。Preferences 類提供一系列 put() 方法,如下所示,用于存儲值。除支持基本的字符串之外,您還可以存儲布爾值、雙精度數(shù)、浮點數(shù)、整型數(shù)、長整型數(shù)和字節(jié)數(shù)組(考慮序列化)。助手方法采用適當?shù)臄?shù)據(jù)類型并執(zhí)行必要的轉(zhuǎn)換以便將數(shù)據(jù)存儲為字符串。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)個字符。讀數(shù)據(jù)可通過下面所示的一系列 get() 方法獲取特定的首選項。與寫數(shù)據(jù)相似,每種受支持的數(shù)據(jù)類型,都有自己的與眾不同的方法。但與獲取數(shù)據(jù)時不同的是,在備用存儲不可用,或有些東西尚未保存時您必須提供缺省值。這要求您確保自己的程序至少要有合理的缺省設(shè)置選項。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é)點相關(guān)聯(lián)的鍵。這個方法返回節(jié)點的 String。 除獲取和存儲個別首選項以及獲取一列關(guān)鍵字之外,您還可以用 clear()、remove() 和 removeNode() 除去節(jié)點和值。轉(zhuǎn)儲數(shù)據(jù)如果您想在系統(tǒng)提供的備用存儲器之外保存和恢復(fù)首選項,您可以在 XML 格式的文檔中執(zhí)行這些操作。您可以用 exportNode() 導(dǎo)出一個節(jié)點或用 exportSubtree() 導(dǎo)出整個子樹。信息以 UTF-8 格式存儲。然后,當您想恢復(fù)信息時,可使用 importPreferences() 方法。偵聽“好奇心會害死一只貓”,但如果您對弄清除首選項何時改變很感興趣,您可以注冊一個 NodeChangeListener 或 PreferenceChangeListener,而不考慮隨之而來的后果。NodeChangeListener 負責(zé)通知您節(jié)點被添加和除去的時間, 而 PreferenceChangeListener 告訴您值的變化。這些都緊跟著基本 JavaBeans 組件事件用 add/removeNodeChangeListener(NodeChangeListener) 和 add/removePreferenceChangeListener() 方法處理結(jié)構(gòu)之后發(fā)生?;旧?,您先實現(xiàn)偵聽器,然后注冊偵聽器,這樣您會發(fā)現(xiàn)將來的變化。作者:peter出處:論壇責(zé)任編輯: 方舟 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操作注冊表還是不方便,不能讓鍵值大寫,不能改最根部的目錄實現(xiàn)代碼如下: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é)點參數(shù)項*/14. Preferencesprefs=Preferences.userRoot().node(/zldzjc/fps);/同樣不能大寫 15. 16. /*儲存參數(shù)項*/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é)點參數(shù)項*/33. Preferencesprefs=Preferences.userRoot().node(/zldzjc/fpz); 34. 35. /*儲存參數(shù)項*/36. for(inti=0;ikeys.length;i+) 37. 38. prefs.putLong(keysi,valuesi); 39. TrueOrFalse=true; 40. 41. returnTrueOrFalse; 42. 43. 44. /*導(dǎo)出到XML文件*/45. /try 46. / 47. /FileOutputStreamfos=newFileOutputStream(prefs.xml);/可以把實現(xiàn)的功能存儲到xml里 48. /prefs.exportNode(fos); 49. / 50. /catch(Exceptione) 51. / 52. /System.err.println(Cannotexportnodes:+e); 53. / 54. 55. /*去掉注釋可以清除注冊表中的參數(shù)項*/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é)點參數(shù)項*/ Preferences prefs = Preferences.userRoot().node(/zldzjc/fps);/同樣不能大寫 /* 儲存參數(shù)項*/ 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é)點參數(shù)項*/ Preferences prefs = Preferences.userRoot().node(/zldzjc/fpz); /* 儲存參數(shù)項*/ for (int i=0 ; i keys.length; i+) prefs.putLong(keysi, valuesi); TrueOrFalse = true ; return TrueOrFalse ; /* 導(dǎo)出到XML文件 */ try/ / FileOutputStream fos = new FileOutputStream(prefs.xml);/可以把實現(xiàn)的功能存儲到xml里/ prefs.exportNode(fos);/ / catch (Exception e)/ / System.err.println(Cannot export nodes: + e);/ /* 去掉注釋可以清除注冊表中的參數(shù)項*/ /*try prefsdemo.removeNode(); catch (BackingStoreException e) */ 由于java程序是“write once, run everywhere”,用java讀寫注冊表,那程序的跨平臺性就差了。java對注冊表的操作,在jdk1.4以前的版本中,那是不可能的,只能用JNI來實現(xiàn);然而jdk1.4之后提供的prefs包可以操作windows注冊表,不過定死了root只在SOFTWARE/JavaSoft/prefs下,估計也是出于這種兩難吧,又要保證所謂平臺無關(guān),還要照顧大家對windows的依賴。下面將從兩方面來介紹對注冊表的操作。一、使用JDK提供的Preferences類首先得到Preferences的一個對象,這個對象就規(guī)定了你要在注冊表的哪個位置寫入信息,即節(jié)點.然后再用put(String key,String value)或者putInt(),tDouble().等來給有關(guān)項賦值。下面是Demo程序。Java代碼 1. importjava.util.prefs.*; 2. publicclassRegistery 3. Stringkeys=version,initial,creator; 4. Stringvalues=1.3,ini.mp3,; 5. /把相應(yīng)的值儲存到變量中去 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, ; /把相應(yīng)的值儲存到變量中去 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對應(yīng)的鍵值,若要得到myValue鍵對應(yīng)的值數(shù)據(jù),則需要String str = v.getDate().toSting();9、設(shè)置注冊表中鍵的值: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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZJBS 001-2024 城市公共標識系統(tǒng)設(shè)計規(guī)范
- T-ZSA 230-2024 虛擬數(shù)字人多模態(tài)交互信息規(guī)范
- 二零二五年度荒山土地流轉(zhuǎn)與林業(yè)碳匯項目合作合同
- 二零二五年度企業(yè)合規(guī)管理體系法律服務(wù)合同范本
- 二零二五年度離婚協(xié)議書模板及婚姻關(guān)系終止及財產(chǎn)分配
- 二零二五年度診所醫(yī)療事故處理及責(zé)任劃分合同
- 二零二五年度養(yǎng)老護理型住宅正規(guī)房屋出租合同
- 二零二五年度混凝土班組勞務(wù)合作施工安全責(zé)任合同
- 二零二五年度銷售信息保密管理承諾書
- 2025年度耕地租賃與農(nóng)業(yè)科技推廣合同
- 部編版小學(xué)(2024版)小學(xué)道德與法治一年級下冊《有個新目標》-第一課時教學(xué)課件
- 稅法(第5版) 課件 第13章 印花稅
- 建加油站申請書
- 2024-2025學(xué)年廣州市高二語文上學(xué)期期末考試卷附答案解析
- 少年商學(xué)院《DeepSeek中小學(xué)生使用手冊》
- 2025年山東鋁業(yè)職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2024年教育公共基礎(chǔ)知識筆記
- 《銷售合同執(zhí)行》課件
- 深夜地鐵7號線施工方案
- 山東2024年山東經(jīng)貿(mào)職業(yè)學(xué)院第二批招聘102人歷年參考題庫(頻考版)含答案解析
- 宮腔球囊止血護理常規(guī)
評論
0/150
提交評論