关键字: java 注册表
Microsoft Windows 9x、Windows CE、Windows NT和Windows 2000中使用的中央分层数据库,用于存储为一个或多个用户、应用程序和硬件设备配置系统所必需的信息。
注册表包含 Windows 在运行期间不断引用的信息,例如,每个用户的配置文件、计算机上安装的应用程序以及每个应用程序可以创建的文档类型、文件夹和应用程序图标的属性表设置、系统上存在哪些硬件以及正在使用哪些端口。
注册表取代了 Windows 3.x 和 MS-DOS 配置文件(例如,Autoexec.bat 和 Config.sys)中使用的绝大多数基于文本的 .ini 文件。虽然几个 Windows 操作系统都有注册表,但这些操作系统的注册表有一些区别。
如果您对以上的内容还不了解,那么您可能需要阅读一下这篇文章《Microsoft Windows 注册表说明》,可以从参考资料中找到,同时还可以找到它的英文原文"Description of the Microsoft Windows registry"。
如果您理解上面的内容就可以往下继续了。
Preferences API并不是为访问Windows注册表而设计的,这是值得指出的一点。
我们之所以会有上面的误解是由于Sun的Windows版本的JDK在实现Preferences API时使用了Windows注册表作为存储库,即我们用Preferences API存储的数据会保存到Windows注册表中,这样Preferenes API也就有了访问Windows注册表的能力。但是换到其它的平台或其它厂商的JDK实现又会怎么样呢?这个问题是和Preferences API的实现相关的,我们没有办法回答。
如果程序不关心存储库的细节,只是要找一个存放数据的地方,那么Preferences API很合适。
Preferences API也是有局限的,请您考虑两个问题:
如果您对Preferences API还不了解,那么您可能需要阅读一下这篇文章《用Preferences API存储对象》,可以从
Windows操作系统提供了操作注册表的API,因此用JNI将Java和这些API连接起来我们就获得了用Java操作注册表的能力。这说起来有些简单,实现起来却需要处理大量的细节。幸运的是这样的工作已经有人做了,我们要感谢他们。下面我们就来看看其中的一个包。
com.ice.jni.registry 包是通过JNI(Java native interface)实现的Windows注册表操作API,可以用来访问、修改和导出Windows注册表。现在这个包已经公开了,可以放心的使用而不必担心license的问题,并且包括一个构建好的DLL和Java、C的源代码。它可以在Java 1.1和更高的版本上工作。
如果您向我一样也对JNI感兴趣,那么这也是学习JNI的很好的示例。
下面详细的描述一下这个包中的类,数量不是很多:
如果您需要了解更多的细节,请查阅
RegistryKey的方法概要:
方法 | 简短描述 |
void closeKey() | 关闭该subkey。 |
RegistryKey connectRegistry(java.lang.String hostName) | 连接远程主机hostName的注册表。 |
RegistryKey createSubKey(java.lang.String subkey, java.lang.String className) | 创建和打开该key的subkey,具有写权限。 |
RegistryKey createSubKey(java.lang.String subKey, java.lang.String className, int access) | 创建和打开该key的subkey,具有指定的权限。 |
int decrDoubleWord(java.lang.String valueName) | 该方法将消减REG_DWORD的值。 |
void deleteSubKey(java.lang.String subKey) | 删除该subkey。 |
void deleteValue(java.lang.String valueName) | 删除一个命名的值。 |
static java.lang.String expandEnvStrings(java.lang.String exString) | 展开exString中的环境变量。 |
void export(java.io.PrintWriter out, boolean descend) | 导出key。 |
void finalize() | 重载了的finalize()方法,确保能够关闭key。 |
void flushKey() | 确保这个key被写到磁盘,对性能有一定的影响。 |
java.lang.String getDefaultValue() | 得到该key的默认值。 |
java.lang.String getFullName() | 得到key的全名。 |
int getMaxSubkeyLength() | 得到所有subkey名称的最大长度。 |
int getMaxValueDataLength() | 得到所有subkey值的最大长度。 |
int getMaxValueNameLength() | 得到所有值的名称的最大长度。 |
java.lang.String getName() | 得到该key的名称。 |
int getNumberSubkeys() | 得到subkey的数量。 |
int getNumberValues() | 得到值的数量。 |
java.lang.String getStringValue(java.lang.String valueName) | 得到REG_SZ或REG_EXPAND_SZ的值。 |
RegistryValue getValue(java.lang.String valueName) | 得到valueName的值。 |
boolean hasDefaultValue() | 判断该key是否有默认值。 |
boolean hasOnlyDefaultValue() | 判断该key是否只有默认值。 |
int incrDoubleWord(java.lang.String valueName) | 该方法将增强REG_DWORD的值。 |
java.util.Enumeration keyElements() | 枚举该key的subkey的名称。 |
RegistryKey openSubKey(java.lang.String subkey) | 打开该key的subkey,具有读权限。 |
RegistryKey openSubKey(java.lang.String subKey, int access) | 打开该key的subkey,具有指定的权限。 |
java.lang.String regEnumKey(int index) | 得到该key在index处的subkey。 |
java.lang.String regEnumValue(int index) | 得到该key在index处的subkey的值。 |
void setCreated(boolean created) | 设置该key的created状态。 |
void setValue(RegistryValue value) | 设置该key的值。 |
void setValue(java.lang.String valueName, RegistryValue value) | 设置valueName的值。 |
java.util.Enumeration valueElements() | 枚举该key的值的名称。 |
boolean wasCreated() | 判断该key是被opened还是被created和opened。 |
最后我们来看一个代码示例:
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) { //创建注册表项并设置相应的值 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(); } //打开注册表项并读出相应的值 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(); } } }
创建的注册表项如图所示:
输出结果为:
subKey1Value
subKey2Value