Atitit.操作注冊表?樹形數據庫?注冊表的歷史?java版本類庫總結
?
1.?注冊表是樹形數據庫 1
2.?注冊表的由來 1
3.?Java??操作注冊表 2
3.1.?使用Preferences?API?(限定訪問路徑了) 2
3.2.?使用JNI 3
3.3.?Jregistrykey?推薦 4
3.4.?Jregistry 4
4.?org.openqa.selenium.os.WindowsUtils 4
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注冊表而設計的,這是值得指出的一點。
我們之所以會有上面的誤解是由于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?位置插入三個鍵值
3.2.?使用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和更高的版本上工作。?
?
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
?