用Java操作Windows注册表

用Java操作Windows注册表
2007-01-29 18:11
最近在做一个java客户端应该程序,现在程序做好了,但差怎么写入系统让它跟随系统自动运行,因为之前没做写这方面的实践一时间无从入手,后来在网上转了几圈,哈哈,终于功夫不负有心人呀。让我找到了。现在也共享给大家希望可以帮助上有需要的朋友。
MicrosoftWindows9x、WindowsCE、WindowsNT和Windows2000中使用的中央分层数据库,用于存储为一个或多个用户、应用程序和硬件设备配置系统所必需的信息。

MicrosoftWindows9x、WindowsCE、WindowsNT和Windows2000中使用的中央分层数据库,用于存储为一个或多个用户、应用程序和硬件设备配置系统所必需的信息。

注册表包含Windows在运行期间不断引用的信息,例如,每个用户的配置文件、计算机上安装的应用程序以及每个应用程序可以创建的文档类型、文件夹和应用程序图标的属性表设置、系统上存在哪些硬件以及正在使用哪些端口。

注册表取代了Windows3.x和MS-DOS配置文件(例如,Autoexec.bat和Config.sys)中使用的绝大多数基于文本的.ini文件。虽然几个Windows操作系统都有注册表,但这些操作系统的注册表有一些区别。

如果您对以上的内容还不了解,那么您可能需要阅读一下这篇文章《MicrosoftWindows注册表说明》,可以从参考资料中找到,同时还可以找到它的英文原文"DescriptionoftheMicrosoftWindowsregistry"。

如果您理解上面的内容就可以往下继续了。

PreferencesAPI并不是为访问Windows注册表而设计的,这是值得指出的一点。

我们之所以会有上面的误解是由于Sun的Windows版本的JDK在实现PreferencesAPI时使用了Windows注册表作为存储库,即我们用PreferencesAPI存储的数据会保存到Windows注册表中,这样PreferenesAPI也就有了访问Windows注册表的能力。但是换到其它的平台或其它厂商的JDK实现又会怎么样呢?这个问题是和PreferencesAPI的实现相关的,我们没有办法回答。

如果程序不关心存储库的细节,只是要找一个存放数据的地方,那么PreferencesAPI很合适。

PreferencesAPI也是有局限的,请您考虑两个问题:

  • 一个Java软件,这次我在Sun的JDK上运行并使用PreferencesAPI保存了我的个人喜好,下次我在IBM的JDK上运行,这时我的个人喜好还可以通过PreferencesAPI得到吗?可能可以也可能不可以,这时的行为是由Sun和IBM的PreferencesAPI实现决定的。(在相同的JDK实现上可以使用PreferencesAPI来在不同的程序间共享数据)
  • 一个Java软件需要让用户设置是否和操作系统一起启动,类似的需求还很多。这类需求就是要求Java程序有真正的和相关操作系统协同的能力。这种能力不是PreferencesAPI的设计目标。

如果您对PreferencesAPI还不了解,那么您可能需要阅读一下这篇文章《用PreferencesAPI存储对象》,可以从参考资料中找到。

Windows操作系统提供了操作注册表的API,因此用JNI将Java和这些API连接起来我们就获得了用Java操作注册表的能力。这说起来有些简单,实现起来却需要处理大量的细节。幸运的是这样的工作已经有人做了,我们要感谢他们。下面我们就来看看其中的一个包。

com.ice.jni.registry包是通过JNI(Javanativeinterface)实现的Windows注册表操作API,可以用来访问、修改和导出Windows注册表。现在这个包已经公开了,可以放心的使用而不必担心license的问题,并且包括一个构建好的DLL和Java、C的源代码。它可以在Java1.1和更高的版本上工作。

如果您向我一样也对JNI感兴趣,那么这也是学习JNI的很好的示例。

下面详细的描述一下这个包中的类,数量不是很多:

  • 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)和相关的一些操作。

如果您需要了解更多的细节,请查阅参考资料中的JNIRegistry的Javadoc、Registry和RegistryReference。

RegistryKey的方法概要:

方法简短描述
voidcloseKey()关闭该subkey。
RegistryKeyconnectRegistry(java.lang.StringhostName)连接远程主机hostName的注册表。
RegistryKeycreateSubKey(java.lang.Stringsubkey,java.lang.StringclassName)创建和打开该key的subkey,具有写权限。
RegistryKeycreateSubKey(java.lang.StringsubKey,java.lang.StringclassName,intaccess)创建和打开该key的subkey,具有指定的权限。
intdecrDoubleWord(java.lang.StringvalueName)该方法将消减REG_DWORD的值。
voiddeleteSubKey(java.lang.StringsubKey)删除该subkey。
voiddeleteValue(java.lang.StringvalueName)删除一个命名的值。
staticjava.lang.StringexpandEnvStrings(java.lang.StringexString)展开exString中的环境变量。
voidexport(java.io.PrintWriterout,booleandescend)导出key。
voidfinalize()重载了的finalize()方法,确保能够关闭key。
voidflushKey()确保这个key被写到磁盘,对性能有一定的影响。
java.lang.StringgetDefaultValue()得到该key的默认值。
java.lang.StringgetFullName()得到key的全名。
intgetMaxSubkeyLength()得到所有subkey名称的最大长度。
intgetMaxValueDataLength()得到所有subkey值的最大长度。
intgetMaxValueNameLength()得到所有值的名称的最大长度。
java.lang.StringgetName()得到该key的名称。
intgetNumberSubkeys()得到subkey的数量。
intgetNumberValues()得到值的数量。
java.lang.StringgetStringValue(java.lang.StringvalueName)得到REG_SZ或REG_EXPAND_SZ的值。
RegistryValuegetValue(java.lang.StringvalueName)得到valueName的值。
booleanhasDefaultValue()判断该key是否有默认值。
booleanhasOnlyDefaultValue()判断该key是否只有默认值。
intincrDoubleWord(java.lang.StringvalueName)该方法将增强REG_DWORD的值。
java.util.EnumerationkeyElements()枚举该key的subkey的名称。
RegistryKeyopenSubKey(java.lang.Stringsubkey)打开该key的subkey,具有写权限。
RegistryKeyopenSubKey(java.lang.StringsubKey,intaccess)打开该key的subkey,具有指定的权限。
java.lang.StringregEnumKey(intindex)得到该key在index处的subkey。
java.lang.StringregEnumValue(intindex)得到该key在index处的subkey的值。
voidsetCreated(booleancreated)设置该key的created状态。
voidsetValue(RegistryValuevalue)设置该key的值。
voidsetValue(java.lang.StringvalueName,RegistryValuevalue)设置valueName的值。
java.util.EnumerationvalueElements()枚举该key的值的名称。
booleanwasCreated()判断该key是被opened还是被created和opened。

最后我们来看一个代码示例:

 
     
 
     
 
     

参考资料

来自:http://hi.baidu.com/breezedancer/blog/item/46c6bfdefdb47c58cdbf1a62.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值