使用Java读写Windows注册表

使用Java读写Windows注册表

如何使用Java对Windows注册表进行读写?



PIPIONE
浏览 1879回答 4
4回答

肥皂起泡泡

我知道这个问题很古老,但它是Google上第一个搜索“java读/写到注册表”的结果。最近我发现了一段令人惊奇的代码:可以读取/写入注册表的任何部分。不使用JNI。不使用任何第三方/外部应用程序工作。不使用windows api(直接)这是纯Java代码。它通过实际访问java.util.prefs.Preferences班级,等级。这个类的内部结构很复杂,但是这个类本身很容易使用。例如,下面的代码获得确切的windows分布从登记处:String&nbsp;value&nbsp;=&nbsp;WinRegistry.readString&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;WinRegistry.HKEY_LOCAL_MACHINE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//HKEY &nbsp;&nbsp;&nbsp;"SOFTWARE\\Microsoft\\Windows&nbsp;NT\\CurrentVersion",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Key &nbsp;&nbsp;&nbsp;"ProductName");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//ValueName &nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Windows&nbsp;Distribution&nbsp;=&nbsp;"&nbsp;+&nbsp;value);这是原班。只要复制粘贴它,它就能工作:import&nbsp;java.lang.reflect.InvocationTargetException;import&nbsp;java.lang.reflect.Method;import&nbsp;java.util.HashMap;import&nbsp;java.util.Map; import&nbsp;java.util.ArrayList;import&nbsp;java.util.List;import&nbsp;java.util.prefs.Preferences;public&nbsp;class&nbsp;WinRegistry&nbsp;{ &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;HKEY_CURRENT_USER&nbsp;=&nbsp;0x80000001; &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;HKEY_LOCAL_MACHINE&nbsp;=&nbsp;0x80000002; &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;REG_SUCCESS&nbsp;=&nbsp;0; &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;REG_NOTFOUND&nbsp;=&nbsp;2; &nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;REG_ACCESSDENIED&nbsp;=&nbsp;5; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;KEY_ALL_ACCESS&nbsp;=&nbsp;0xf003f; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;KEY_READ&nbsp;=&nbsp;0x20019; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Preferences&nbsp;userRoot&nbsp;=&nbsp;Preferences.userRoot(); &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Preferences&nbsp;systemRoot&nbsp;=&nbsp;Preferences.systemRoot(); &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Class<?&nbsp;extends&nbsp;Preferences>&nbsp;userClass&nbsp;=&nbsp;userRoot.getClass(); &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Method&nbsp;regOpenKey; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Method&nbsp;regCloseKey; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Method&nbsp;regQueryValueEx; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Method&nbsp;regEnumValue; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Method&nbsp;regQueryInfoKey; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Method&nbsp;regEnumKeyEx; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Method&nbsp;regCreateKeyEx; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Method&nbsp;regSetValueEx; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Method&nbsp;regDeleteKey; &nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Method&nbsp;regDeleteValue; &nbsp;&nbsp;static&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regOpenKey&nbsp;=&nbsp;userClass.getDeclaredMethod("WindowsRegOpenKey", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Class[]&nbsp;{&nbsp;int.class,&nbsp;byte[].class,&nbsp;int.class&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regOpenKey.setAccessible(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regCloseKey&nbsp;=&nbsp;userClass.getDeclaredMethod("WindowsRegCloseKey", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Class[]&nbsp;{&nbsp;int.class&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regCloseKey.setAccessible(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regQueryValueEx&nbsp;=&nbsp;userClass.getDeclaredMethod("WindowsRegQueryValueEx", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Class[]&nbsp;{&nbsp;int.class,&nbsp;byte[].class&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regQueryValueEx.setAccessible(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regEnumValue&nbsp;=&nbsp;userClass.getDeclaredMethod("WindowsRegEnumValue", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Class[]&nbsp;{&nbsp;int.class,&nbsp;int.class,&nbsp;int.class&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regEnumValue.setAccessible(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regQueryInfoKey&nbsp;=&nbsp;userClass.getDeclaredMethod("WindowsRegQueryInfoKey1", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Class[]&nbsp;{&nbsp;int.class&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regQueryInfoKey.setAccessible(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regEnumKeyEx&nbsp;=&nbsp;userClass.getDeclaredMethod(&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"WindowsRegEnumKeyEx",&nbsp;new&nbsp;Class[]&nbsp;{&nbsp;int.class,&nbsp;int.class,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int.class&nbsp;});&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regEnumKeyEx.setAccessible(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regCreateKeyEx&nbsp;=&nbsp;userClass.getDeclaredMethod(&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"WindowsRegCreateKeyEx",&nbsp;new&nbsp;Class[]&nbsp;{&nbsp;int.class,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[].class&nbsp;});&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regCreateKeyEx.setAccessible(true);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regSetValueEx&nbsp;=&nbsp;userClass.getDeclaredMethod(&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"WindowsRegSetValueEx",&nbsp;new&nbsp;Class[]&nbsp;{&nbsp;int.class,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[].class,&nbsp;byte[].class&nbsp;});&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regSetValueEx.setAccessible(true);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regDeleteValue&nbsp;=&nbsp;userClass.getDeclaredMethod(&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"WindowsRegDeleteValue",&nbsp;new&nbsp;Class[]&nbsp;{&nbsp;int.class,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[].class&nbsp;});&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regDeleteValue.setAccessible(true);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regDeleteKey&nbsp;=&nbsp;userClass.getDeclaredMethod(&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"WindowsRegDeleteKey",&nbsp;new&nbsp;Class[]&nbsp;{&nbsp;int.class,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[].class&nbsp;});&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regDeleteKey.setAccessible(true);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;RuntimeException(e); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;WinRegistry()&nbsp;{&nbsp;&nbsp;} &nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;*&nbsp;Read&nbsp;a&nbsp;value&nbsp;from&nbsp;key&nbsp;and&nbsp;value&nbsp;name &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;hkey&nbsp;&nbsp;&nbsp;HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;valueName &nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;the&nbsp;value &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalArgumentException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalAccessException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;InvocationTargetException &nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;public&nbsp;static&nbsp;String&nbsp;readString(int&nbsp;hkey,&nbsp;String&nbsp;key,&nbsp;String&nbsp;valueName)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_LOCAL_MACHINE)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;readString(systemRoot,&nbsp;hkey,&nbsp;key,&nbsp;valueName); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_CURRENT_USER)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;readString(userRoot,&nbsp;hkey,&nbsp;key,&nbsp;valueName); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException("hkey="&nbsp;+&nbsp;hkey); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;*&nbsp;Read&nbsp;value(s)&nbsp;and&nbsp;value&nbsp;name(s)&nbsp;form&nbsp;given&nbsp;key&nbsp; &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;hkey&nbsp;&nbsp;HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;the&nbsp;value&nbsp;name(s)&nbsp;plus&nbsp;the&nbsp;value(s) &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalArgumentException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalAccessException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;InvocationTargetException &nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;public&nbsp;static&nbsp;Map<String,&nbsp;String>&nbsp;readStringValues(int&nbsp;hkey,&nbsp;String&nbsp;key)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_LOCAL_MACHINE)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;readStringValues(systemRoot,&nbsp;hkey,&nbsp;key); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_CURRENT_USER)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;readStringValues(userRoot,&nbsp;hkey,&nbsp;key); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException("hkey="&nbsp;+&nbsp;hkey); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;*&nbsp;Read&nbsp;the&nbsp;value&nbsp;name(s)&nbsp;from&nbsp;a&nbsp;given&nbsp;key &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;hkey&nbsp;&nbsp;HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;the&nbsp;value&nbsp;name(s) &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalArgumentException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalAccessException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;InvocationTargetException &nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;public&nbsp;static&nbsp;List<String>&nbsp;readStringSubKeys(int&nbsp;hkey,&nbsp;String&nbsp;key)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_LOCAL_MACHINE)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;readStringSubKeys(systemRoot,&nbsp;hkey,&nbsp;key); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_CURRENT_USER)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;readStringSubKeys(userRoot,&nbsp;hkey,&nbsp;key); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException("hkey="&nbsp;+&nbsp;hkey); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;a&nbsp;key &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;hkey&nbsp;&nbsp;HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalArgumentException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalAccessException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;InvocationTargetException &nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;createKey(int&nbsp;hkey,&nbsp;String&nbsp;key)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;[]&nbsp;ret; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_LOCAL_MACHINE)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;createKey(systemRoot,&nbsp;hkey,&nbsp;key); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regCloseKey.invoke(systemRoot,&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(ret[0])&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_CURRENT_USER)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;createKey(userRoot,&nbsp;hkey,&nbsp;key); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regCloseKey.invoke(userRoot,&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(ret[0])&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException("hkey="&nbsp;+&nbsp;hkey); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret[1]&nbsp;!=&nbsp;REG_SUCCESS)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException("rc="&nbsp;+&nbsp;ret[1]&nbsp;+&nbsp;"&nbsp;&nbsp;key="&nbsp;+&nbsp;key); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;*&nbsp;Write&nbsp;a&nbsp;value&nbsp;in&nbsp;a&nbsp;given&nbsp;key/value&nbsp;name &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;hkey &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;valueName &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;value &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalArgumentException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalAccessException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;InvocationTargetException &nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;writeStringValue&nbsp;&nbsp;&nbsp;&nbsp;(int&nbsp;hkey,&nbsp;String&nbsp;key,&nbsp;String&nbsp;valueName,&nbsp;String&nbsp;value)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_LOCAL_MACHINE)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeStringValue(systemRoot,&nbsp;hkey,&nbsp;key,&nbsp;valueName,&nbsp;value); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_CURRENT_USER)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeStringValue(userRoot,&nbsp;hkey,&nbsp;key,&nbsp;valueName,&nbsp;value); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException("hkey="&nbsp;+&nbsp;hkey); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;*&nbsp;Delete&nbsp;a&nbsp;given&nbsp;key &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;hkey &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalArgumentException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalAccessException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;InvocationTargetException &nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;deleteKey(int&nbsp;hkey,&nbsp;String&nbsp;key)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rc&nbsp;=&nbsp;-1; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_LOCAL_MACHINE)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;deleteKey(systemRoot,&nbsp;hkey,&nbsp;key); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_CURRENT_USER)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;deleteKey(userRoot,&nbsp;hkey,&nbsp;key); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rc&nbsp;!=&nbsp;REG_SUCCESS)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException("rc="&nbsp;+&nbsp;rc&nbsp;+&nbsp;"&nbsp;&nbsp;key="&nbsp;+&nbsp;key); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;*&nbsp;delete&nbsp;a&nbsp;value&nbsp;from&nbsp;a&nbsp;given&nbsp;key/value&nbsp;name &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;hkey &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;value &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalArgumentException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IllegalAccessException &nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;InvocationTargetException &nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;deleteValue(int&nbsp;hkey,&nbsp;String&nbsp;key,&nbsp;String&nbsp;value)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rc&nbsp;=&nbsp;-1; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_LOCAL_MACHINE)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;deleteValue(systemRoot,&nbsp;hkey,&nbsp;key,&nbsp;value); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(hkey&nbsp;==&nbsp;HKEY_CURRENT_USER)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;deleteValue(userRoot,&nbsp;hkey,&nbsp;key,&nbsp;value); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rc&nbsp;!=&nbsp;REG_SUCCESS)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException("rc="&nbsp;+&nbsp;rc&nbsp;+&nbsp;"&nbsp;&nbsp;key="&nbsp;+&nbsp;key&nbsp;+&nbsp;"&nbsp;&nbsp;value="&nbsp;+&nbsp;value); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;//&nbsp;===================== &nbsp;&nbsp;private&nbsp;static&nbsp;int&nbsp;deleteValue&nbsp;&nbsp;&nbsp;&nbsp;(Preferences&nbsp;root,&nbsp;int&nbsp;hkey,&nbsp;String&nbsp;key,&nbsp;String&nbsp;value) &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;handles&nbsp;=&nbsp;(int[])&nbsp;regOpenKey.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Integer(hkey),&nbsp;toCstr(key),&nbsp;new&nbsp;Integer(KEY_ALL_ACCESS)&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(handles[1]&nbsp;!=&nbsp;REG_SUCCESS)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;handles[1];&nbsp;&nbsp;//&nbsp;can&nbsp;be&nbsp;REG_NOTFOUND,&nbsp;REG_ACCESSDENIED &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rc&nbsp;=((Integer)&nbsp;regDeleteValue.invoke(root,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Object[]&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Integer(handles[0]),&nbsp;toCstr(value)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})).intValue(); &nbsp;&nbsp;&nbsp;&nbsp;regCloseKey.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(handles[0])&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rc; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;static&nbsp;int&nbsp;deleteKey(Preferences&nbsp;root,&nbsp;int&nbsp;hkey,&nbsp;String&nbsp;key)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rc&nbsp;=((Integer)&nbsp;regDeleteKey.invoke(root,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(hkey),&nbsp;toCstr(key)&nbsp;})).intValue(); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rc;&nbsp;&nbsp;//&nbsp;can&nbsp;REG_NOTFOUND,&nbsp;REG_ACCESSDENIED,&nbsp;REG_SUCCESS &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;static&nbsp;String&nbsp;readString(Preferences&nbsp;root,&nbsp;int&nbsp;hkey,&nbsp;String&nbsp;key,&nbsp;String&nbsp;value) &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;handles&nbsp;=&nbsp;(int[])&nbsp;regOpenKey.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Integer(hkey),&nbsp;toCstr(key),&nbsp;new&nbsp;Integer(KEY_READ)&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(handles[1]&nbsp;!=&nbsp;REG_SUCCESS)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;valb&nbsp;=&nbsp;(byte[])&nbsp;regQueryValueEx.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Integer(handles[0]),&nbsp;toCstr(value)&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;regCloseKey.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(handles[0])&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(valb&nbsp;!=&nbsp;null&nbsp;?&nbsp;new&nbsp;String(valb).trim()&nbsp;:&nbsp;null); &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;static&nbsp;Map<String,String>&nbsp;readStringValues&nbsp;&nbsp;&nbsp;&nbsp;(Preferences&nbsp;root,&nbsp;int&nbsp;hkey,&nbsp;String&nbsp;key) &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;HashMap<String,&nbsp;String>&nbsp;results&nbsp;=&nbsp;new&nbsp;HashMap<String,String>(); &nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;handles&nbsp;=&nbsp;(int[])&nbsp;regOpenKey.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Integer(hkey),&nbsp;toCstr(key),&nbsp;new&nbsp;Integer(KEY_READ)&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(handles[1]&nbsp;!=&nbsp;REG_SUCCESS)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;info&nbsp;=&nbsp;(int[])&nbsp;regQueryInfoKey.invoke(root, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(handles[0])&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;count&nbsp;=&nbsp;info[0];&nbsp;//&nbsp;count&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;maxlen&nbsp;=&nbsp;info[3];&nbsp;//&nbsp;value&nbsp;length&nbsp;max &nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;index=0;&nbsp;index<count;&nbsp;index++)&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;name&nbsp;=&nbsp;(byte[])&nbsp;regEnumValue.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Integer &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(handles[0]),&nbsp;new&nbsp;Integer(index),&nbsp;new&nbsp;Integer(maxlen&nbsp;+&nbsp;1)}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;readString(hkey,&nbsp;key,&nbsp;new&nbsp;String(name)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results.put(new&nbsp;String(name).trim(),&nbsp;value); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;regCloseKey.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(handles[0])&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;results; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;static&nbsp;List<String>&nbsp;readStringSubKeys&nbsp;&nbsp;&nbsp;&nbsp;(Preferences&nbsp;root,&nbsp;int&nbsp;hkey,&nbsp;String&nbsp;key) &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;List<String>&nbsp;results&nbsp;=&nbsp;new&nbsp;ArrayList<String>(); &nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;handles&nbsp;=&nbsp;(int[])&nbsp;regOpenKey.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Integer(hkey),&nbsp;toCstr(key),&nbsp;new&nbsp;Integer(KEY_READ)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(handles[1]&nbsp;!=&nbsp;REG_SUCCESS)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;info&nbsp;=&nbsp;(int[])&nbsp;regQueryInfoKey.invoke(root, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(handles[0])&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;count&nbsp;&nbsp;=&nbsp;info[0];&nbsp;//&nbsp;Fix:&nbsp;info[2]&nbsp;was&nbsp;being&nbsp;used&nbsp;here&nbsp;with&nbsp;wrong&nbsp;results.&nbsp;Suggested&nbsp;by&nbsp;davenpcj,&nbsp;confirmed&nbsp;by&nbsp;Petrucio &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;maxlen&nbsp;=&nbsp;info[3];&nbsp;//&nbsp;value&nbsp;length&nbsp;max &nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;index=0;&nbsp;index<count;&nbsp;index++)&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;name&nbsp;=&nbsp;(byte[])&nbsp;regEnumKeyEx.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Integer &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(handles[0]),&nbsp;new&nbsp;Integer(index),&nbsp;new&nbsp;Integer(maxlen&nbsp;+&nbsp;1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results.add(new&nbsp;String(name).trim()); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;regCloseKey.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(handles[0])&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;results; &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;static&nbsp;int&nbsp;[]&nbsp;createKey(Preferences&nbsp;root,&nbsp;int&nbsp;hkey,&nbsp;String&nbsp;key) &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;(int[])&nbsp;regCreateKeyEx.invoke(root, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(hkey),&nbsp;toCstr(key)&nbsp;}); &nbsp;&nbsp;} &nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;writeStringValue&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;(Preferences&nbsp;root,&nbsp;int&nbsp;hkey,&nbsp;String&nbsp;key,&nbsp;String&nbsp;valueName,&nbsp;String&nbsp;value)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IllegalArgumentException,&nbsp;IllegalAccessException, &nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException&nbsp; &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;handles&nbsp;=&nbsp;(int[])&nbsp;regOpenKey.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Integer(hkey),&nbsp;toCstr(key),&nbsp;new&nbsp;Integer(KEY_ALL_ACCESS)&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;regSetValueEx.invoke(root,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Object[]&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Integer(handles[0]),&nbsp;toCstr(valueName),&nbsp;toCstr(value)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;regCloseKey.invoke(root,&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(handles[0])&nbsp;}); &nbsp;&nbsp;} &nbsp;&nbsp;//&nbsp;utility &nbsp;&nbsp;private&nbsp;static&nbsp;byte[]&nbsp;toCstr(String&nbsp;str)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;result&nbsp;=&nbsp;new&nbsp;byte[str.length()&nbsp;+&nbsp;1]; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;str.length();&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[i]&nbsp;=&nbsp;(byte)&nbsp;str.charAt(i); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;result[str.length()]&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result; &nbsp;&nbsp;}}我无法找到这段代码的原作者并给予赞扬。如果您发现任何细节,请添加评论,我将在这里添加它。

尚方宝剑之说

你其实不需要第三方包裹。Windows具有用于所有注册表操作的reg实用程序。要获得命令格式,请转到DOS Promt并键入:reg&nbsp;/?你可以调用雷格通过Runtime类:Runtime.getRuntime().exec("reg&nbsp;<your&nbsp;parameters&nbsp;here>");使用上面的命令编辑键和添加新键非常简单。要读取注册表,您需要雷格的输出,这有点棘手。下面是代码:import&nbsp;java.io.IOException;import&nbsp;java.io.InputStream;import&nbsp;java.io.StringWriter;/** &nbsp;*&nbsp;@author&nbsp;Oleg&nbsp;Ryaboy,&nbsp;based&nbsp;on&nbsp;work&nbsp;by&nbsp;Miguel&nbsp;Enriquez&nbsp; &nbsp;*/public&nbsp;class&nbsp;WindowsReqistry&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;location&nbsp;path&nbsp;in&nbsp;the&nbsp;registry &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key&nbsp;registry&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;registry&nbsp;value&nbsp;or&nbsp;null&nbsp;if&nbsp;not&nbsp;found &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;String&nbsp;readRegistry(String&nbsp;location,&nbsp;String&nbsp;key){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Run&nbsp;reg&nbsp;query,&nbsp;then&nbsp;read&nbsp;output&nbsp;with&nbsp;StreamReader&nbsp;(internal&nbsp;class) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Process&nbsp;process&nbsp;=&nbsp;Runtime.getRuntime().exec("reg&nbsp;query&nbsp;"&nbsp;+&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'"'+&nbsp;location&nbsp;+&nbsp;"\"&nbsp;/v&nbsp;"&nbsp;+&nbsp;key); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamReader&nbsp;reader&nbsp;=&nbsp;new&nbsp;StreamReader(process.getInputStream()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.start(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process.waitFor(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.join(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;output&nbsp;=&nbsp;reader.getResult(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Output&nbsp;has&nbsp;the&nbsp;following&nbsp;format: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;\n<Version&nbsp;information>\n\n<key>\t<registry&nbsp;type>\t<value> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;!&nbsp;output.contains("\t")){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Parse&nbsp;out&nbsp;the&nbsp;value &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;parsed&nbsp;=&nbsp;output.split("\t"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;parsed[parsed.length-1]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;class&nbsp;StreamReader&nbsp;extends&nbsp;Thread&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;InputStream&nbsp;is; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;StringWriter&nbsp;sw=&nbsp;new&nbsp;StringWriter(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;StreamReader(InputStream&nbsp;is)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.is&nbsp;=&nbsp;is; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;c; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((c&nbsp;=&nbsp;is.read())&nbsp;!=&nbsp;-1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sw.write(c); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getResult()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sw.toString(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Sample&nbsp;usage &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;WindowsReqistry.readRegistry("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\"&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"Explorer\\Shell&nbsp;Folders",&nbsp;"Personal"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(value); &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP