如何用Java操作注册表
来源:互联网 发布:淘宝直通车关键词 编辑:程序博客网 时间:2024/04/27 20:12
使用Preferences API 参考资料
Preferences的误解:
首先要指明的是:Preferences API并不是为访问Windows注册表而设计的。
我们之所以会有上面的误解是由于Sun的Windows版本的JDK在实现Preferences API时使用了Windows注册表作为存储库,即我们用Preferences API存储的数据会保存到Windows注册表中,这样Preferenes API也就有了访问Windows注册表的能力。但是换到其它的平台或其它厂商的JDK实现又会怎么样呢?这个问题是和Preferences API的实现相关的,我们没有办法回答。
Preferences适用的条件:
如果程序不关心存储库的细节,只是要找一个存放数据的地方,那么Preferences API很合适。
Preferences API的局限:
一个Java软件,这次我在Sun的JDK上运行并使用Preferences API保存了我的个人喜好,下次我在IBM的JDK上运行,这时我的个人喜好还可以通过Preferences API得到吗?可能可以也可能不可以,这时的行为是由Sun和IBM的Preferences API实现决定的。(在相同的JDK实现上可以使用Preferences API来在不同的程序间共享数据)
一个Java软件需要让用户设置是否和操作系统一起启动,类似的需求还很多。这类需求就是要求Java程序有真正的和相关操作系统协同的能力。这种能力不是Preferences API的设计目标。
使用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和更高的版本上工作。
下面详细的描述一下这个包中的类,数量不是很多:
- HexNumberFormat 用来格式化和分析十六进制整数。
- RegBinaryValue 表示类型为REG_BINARY的注册表值。REG_BINARY是指任意形式的二进制数。
- RegDWordValue 表示类型为REG_DWORD的注册表值。REG_DWORD是指一个32位的整数。根据该整数的字节序不同又分为 REG_DWORD_LITTLE_ENDIAN和REG_DWORD_BIG_ENDIAN。在Windows中REG_DWORD和 REG_DWORD_LITTLE_ENDIAN有相同的含义。
- RegistryValue 表示任意类型的注册表值,这是一个抽象类,不能被实例化。
- RegMultiStringValue 表示类型为REG_MULTI_SZ的注册表值。REG_MULTI_SZ是一个null-terminated的字符串的序列。
- RegStringValue 表示类型为REG_SZ和REG_EXPAND_SZ的注册表值。REG_SZ是指一个null-terminated的字符串,REG_EXPAND_SZ是指一个含有未展开的环境变量的null-terminated的字符串。
- Registry 这个类定义了定级项(Key),包括HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG、 HKEY_CURRENT_USER、HKEY_DYN_DATA、HKEY_LOCAL_MACHINE、HKEY_PERFORMANCE_DATA 和HKEY_USERS。还定义了错误代码,这些错误代码会包含在RegistryException中。最后是一些工具方法,如 dumpHexData、exportRegistryKey、getErrorMessage、getTopLevelKey、openSubkey、 parseArgumentString、parseArgumentVector、splitString和usage。
- RegistryKey 定义了注册表的一个表项(Key)和相关的一些操作。
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
- 用Preferences API存储对象,这是一篇来自IBM的文章可以使您进一步了解Preferences API。
- Microsoft Windows 注册表说明
- Description of the Microsoft Windows registry
- 在JNIRegistry这里可以下载到需要的包和源代码。
- 如果您想阅读JNIRegistry的Java doc可以来这里。
- 在Registry和Registry Reference可以找到关于注册表、注册表函数、注册表结构、注册表元素大小限制和注册表值类型等大量的信息。
说明:我的体会“第一步:把下载下来的jar包加载到工程内,第二步,把与jar包在一起的dll文件拷贝到你jdk安装目录下\jre\bin文件夹下”
- 如何用Java操作注册表
- 如何用C#操作注册表
- 如何用CRegKey类来操作注册表
- 如何用CRegKey类来操作注册表
- 五.如何用批处理文件来操作注册表
- 如何用Java操作MongoDB?
- 如何用Java操作MongoDB?
- 如何用CRegKey类来操作注册表(第二种说明)
- 如何用CRegKey类来操作注册表(转)
- 如何用ATL的CRegKey类来操作注册表
- 如何用Java操作MongoDB(1)
- 如何用Java操作MongoDB(2)
- 如何用Java操作MongoDB(3)
- 浅谈如何用Java操作MongoDB?
- 浅谈如何用Java操作MongoDB
- 浅谈如何用Java操作MongoDB?
- 浅谈如何用Java操作MongoDB?
- 浅谈如何用Java操作MongoDB
- 番茄会计记账软件发布
- SocketAPI之send函数和recv函数详解
- C# Eval在asp.net中的用法及作用
- Android的计量单位px,in,mm,pt,dp,dip,sp
- JavaScript开发者必备的10个超级实用工具
- 如何用Java操作注册表
- [转]epoll 经验谈
- 善良,是最不能丢失的品质
- 主流浏览器的判断
- [ZOJ1426 ][POJ1693] Counting Rectangles
- (学习笔记_2011_07_03)__反汇编__一重for循环
- 一个很实用的WEB打印控件“四方在线WEB打印控件——PAZU”
- Java Process类的浅学习
- 纯真年代