??xml version="1.0" encoding="utf-8" standalone="yes"?>
Preferences的误?/strong>Q?br />
首先要指明的是:(x)Preferences APIq不是ؓ(f)讉KWindows注册表而设计的?br />
我们之所以会(x)有上面的误解是由于Sun的Windows版本的JDK在实现Preferences API时用了(jin)Windows注册表作为存储库Q即我们用Preferences API存储的数据会(x)保存到Windows注册表中Q这样Preferenes API也就有了(jin)讉KWindows注册表的能力。但是换到其它的q_或其它厂商的JDK实现又会(x)怎么样呢Q这个问题是和Preferences API的实现相关的Q我们没有办法回{?br />
Preferences适用的条?/strong>Q?br />
如果E序不关?j)存储库的细节,只是要找一个存放数据的地方Q那么Preferences API很合适?br />
Preferences API的局限:(x)
一个Java软gQ这ơ我在Sun的JDK上运行ƈ使用Preferences API保存?sh)(jin)我的个人喜好,下次我在IBM的JDK上运行,q时我的个h喜好q可以通过Preferences API得到吗?可能可以也可能不可以Q这时的行ؓ(f)是由Sun和IBM的Preferences API实现军_的。(在相同的JDK实现上可以用Preferences API来在不同的程序间׃n数据Q?/font>
一个Java软g需要让用户讄是否和操作系l一起启动,cM的需求还很多。这c需求就是要求JavaE序有真正的和相x(chng)作系l协同的能力。这U能力不是Preferences API的设计目标?/font>
使用JNI 参考资?/font>
Windows操作pȝ提供?jin)操作注册表的APIQ因此用JNIJava和这些APIq接h我们p得了(jin)用Java操作注册表的能力。这说v来有些简单,实现h却需要处理大量的l节。幸q的是这L(fng)工作已经有h做了(jin)Q我们要感谢他们。下面我们就来看看其中的一个包?br />
com.ice.jni.registry包是通过JNI(Java native interface)实现的Windows注册表操作APIQ可以用来访问、修改和导出Windows注册表。现在这个包已经公开?jin),可以攑ֿ?j)的用而不必担?j)license的问题,q且包括一个构建好的DLL和Java、C的源代码。它可以在Java 1.1和更高的版本上工作?br />
下面详细的描qC下这个包中的c,数量不是很多Q?/font>
RegistryKey的方法概要:(x)
Ҏ(gu) | 短描q?/font> |
void closeKey() | 关闭该subkey?/font> |
RegistryKey connectRegistry(java.lang.String hostName) | q接q程LhostName的注册表?/font> |
RegistryKey createSubKey(java.lang.String subkey, java.lang.String className) | 创徏和打开该key的subkeyQ具有写权限?/font> |
RegistryKey createSubKey(java.lang.String subKey, java.lang.String className, int access) | 创徏和打开该key的subkeyQ具有指定的权限?/font> |
int decrDoubleWord(java.lang.String valueName) | 该方法将消减REG_DWORD的倹{?/font> |
void deleteSubKey(java.lang.String subKey) | 删除该subkey?/font> |
void deleteValue(java.lang.String valueName) | 删除一个命名的倹{?/font> |
static java.lang.String expandEnvStrings(java.lang.String exString) | 展开exString中的环境变量?/font> |
void export(java.io.PrintWriter out, boolean descend) | 导出key?/font> |
void finalize() | 重蝲?jin)的finalize()Ҏ(gu)Q确保能够关闭key?/font> |
void flushKey() | 保q个key被写到磁盘,Ҏ(gu)能有一定的影响?/font> |
java.lang.String getDefaultValue() | 得到该key的默认倹{?/font> |
java.lang.String getFullName() | 得到key的全名?/font> |
int getMaxSubkeyLength() | 得到所有subkey名称的最大长度?/font> |
int getMaxValueDataLength() | 得到所有subkey值的最大长度?/font> |
int getMaxValueNameLength() | 得到所有值的名称的最大长度?/font> |
java.lang.String getName() | 得到该key的名U?/font> |
int getNumberSubkeys() | 得到subkey的数量?/font> |
int getNumberValues() | 得到值的数量?/font> |
java.lang.String getStringValue(java.lang.String valueName) | 得到REG_SZ或REG_EXPAND_SZ的倹{?/font> |
RegistryValue getValue(java.lang.String valueName) | 得到valueName的倹{?/font> |
boolean hasDefaultValue() | 判断该key是否有默认倹{?/font> |
boolean hasOnlyDefaultValue() | 判断该key是否只有默认倹{?/font> |
int incrDoubleWord(java.lang.String valueName) | 该方法将增强REG_DWORD的倹{?/font> |
java.util.Enumeration keyElements() | 枚D该key的subkey的名U?/font> |
RegistryKey openSubKey(java.lang.String subkey) | 打开该key的subkeyQ具有写权限?/font> |
RegistryKey openSubKey(java.lang.String subKey, int access) | 打开该key的subkeyQ具有指定的权限?/font> |
java.lang.String regEnumKey(int index) | 得到该key在index处的subkey?/font> |
java.lang.String regEnumValue(int index) | 得到该key在index处的subkey的倹{?/font> |
void setCreated(boolean created) | 讄该key的created状态?/font> |
void setValue(RegistryValue value) | 讄该key的倹{?/font> |
void setValue(java.lang.String valueName, RegistryValue value) | 讄valueName的倹{?/font> |
java.util.Enumeration valueElements() | 枚D该key的值的名称?/font> |
boolean wasCreated() | 判断该key是被openedq是被created和opened?/font> |
最后我们来看一个代码示例:(x)
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) { //创徏注册表项q设|相应的? 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(); } //打开注册表项q读出相应的? 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(); } } }
创徏的注册表如图所C:(x)
![]()
输出l果为:(x)
subKey1Value
subKey2Value
说明Q我的体?#8220;W一步:(x)把下载下来的jar包加载到工程内,W二步,把与jar包在一L(fng)dll文g拯Cjdk安装目录下\jre\bin文g夹下”