- 浏览: 150808 次
- 性别:
- 来自: 天津
-
最新评论
-
回归蔚蓝:
链接地址错了, 那个是管理的地址
spring jdbc 事务 -
331008019:
...
spring 几种获得bean的方法 -
l7495032:
大哥,那里有图呀
Border区域布局 -
luchajava:
我要的是程序不要你的文章
js ide spket
用Java操作Windows注册表
关键字: 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参考资料中找到。
Preferences API并不是为访问Windows注册表而设计的,这是值得指出的一点。
我们之所以会有上面的误解是由于Sun的Windows版本的JDK在实现Preferences API时使用了Windows注册表作为存储库,即我们用Preferences API存储的数据会保存到Windows注册表中,这样Preferenes API也就有了访问Windows注册表的能力。但是换到其它的平台或其它厂商的JDK实现又会怎么样呢?这个问题是和Preferences API的实现相关的,我们没有办法回答。
如果程序不关心存储库的细节,只是要找一个存放数据的地方,那么Preferences API很合适。
Preferences API也是有局限的,请您考虑两个问题:
- 一个Java软件,这次我在Sun的JDK上运行并使用Preferences API保存了我的个人喜好,下次我在IBM的JDK上运行,这时我的个人喜好还可以通过Preferences API得到吗?可能可以也可能不可以,这时的行为是由Sun和IBM的Preferences API实现决定的。(在相同的JDK实现上可以使用Preferences API来在不同的程序间共享数据)
- 一个Java软件需要让用户设置是否和操作系统一起启动,类似的需求还很多。这类需求就是要求Java程序有真正的和相关操作系统协同的能力。这种能力不是Preferences API的设计目标。
如果您对Preferences API还不了解,那么您可能需要阅读一下这篇文章《用Preferences API存储对象》,可以从
使用JNI参考资料中的JNIRegistry的Java doc、Registry和Registry Reference。
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的很好的示例。
下面详细的描述一下这个包中的类,数量不是很多:
- 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
- Microsoft Windows 注册表说明
- Description of the Microsoft Windows registry
- 在JNIRegistry这里可以下载到需要的包和源代码。
- 如果您想阅读JNIRegistry的Java doc可以来这里。
- 在Registry和Registry Reference可以找到关于注册表、注册表函数、注册表结构、注册表元素大小限制和注册表值类型等大量的信息。
- 如果您遇到类似'access denied'的异常,可以看一下这里感谢我的朋友们。
发表评论
-
wang
2009-06-04 09:11 16201.BeanUtils介绍很多Java开发人员习惯于创建符合J ... -
wang
2009-06-04 09:06 1204Apache Commons是一个非常有用的工具包,解决各种实 ... -
JSP标签库(jstl )详解之一<c:forEach>
2009-04-16 09:56 3250JSP标签库(jstl )详解之一<c:forEach& ... -
jstl简明教程
2009-04-14 11:09 1586JSTL简介 <%@ taglib uri=" ... -
分页方法比较
2009-04-02 07:55 1229CREATE TABLE [TestTable] ( [I ... -
svhost病毒处理
2009-03-13 11:15 1782SMSS.EXE(Session Manager Subsys ... -
spring jdbc 事务
2009-02-20 15:18 4625Spring2.0用注解实现事务管理 Spring2.0框架 ... -
httpservletrequest 对象详解
2009-02-12 12:20 22648公共接口类HttpServletReque ... -
sql替换
2008-12-08 14:20 1847语法 REPLACE ( original-string, s ... -
Spring中Bean的装配
2008-11-18 20:43 1145Spring中Bean的装配 1、简 ... -
proxool 配置
2008-11-16 08:17 1791Proxool连接池设置【转】 ... -
html meta
2008-11-02 09:17 933meta是用来在HTML文档中模拟HTTP协议的响应头报文。m ... -
忘了发发发发发
2008-09-25 09:59 954解密指定存储过程exec sp_decrypt '存储过程名' ... -
spring 几种获得bean的方法
2008-08-04 13:18 71857几种获得spring里注册Bean的方法 获得spring里 ... -
ext入门
2008-05-18 16:03 5466下面介绍下如何部署ext ... -
自定义标签2
2008-05-01 19:15 1936JSP标签从1.0 开始就已经出现啦,现在JSP都2.0了出现 ... -
自定义标签使用
2008-05-01 18:56 1530JSP-自定义标签(一) 使用自定义标签的好处 1:加 ... -
jstl 标签的使用
2008-04-30 14:54 2139jstl标签可以大大简化jsp页面的维护!!! 安装JSTL过 ... -
基于构建的开发与实践
2008-04-26 08:17 1105经过了两年混乱的管理与开发,深刻的认识到了基于构 ...
相关推荐
222REDCINE软件提取成mov格式再进行剪辑是最佳方案。新版的edius6.5剪r3d格式非常吃力,没实用意义。或者使用premiere cs6可以流畅剪辑,但使用中发现最后输出画质有衰减。
标签“fdfdf”也没有提供任何有意义的信息。压缩包中的文件名“小例子”同样过于笼统,无法确定具体的技术主题。 尽管如此,我们可以从一般的角度讨论编程学习和编写代码示例的重要性。在IT行业中,编写代码示例是...
无聊的时候写的一个类似于系统的alertview,有个小小的动画,只有取消和确定键,代码只供参考,不建议项目使用 使用方法 XCJAlert *popView = [[XCJAlert alloc]initWithFrame:self... NSLog(@"fdfdf"); } }];
- 十六进制值:`#FDFDF0` - RGB值:`RGB(253,253,240)` - 描述:略带一点淡紫色的白色,适合用作装饰色。 6. **GreenVeil** - 十六进制值:`#EEF3E2` - RGB值:`RGB(238,243,226)` - 描述:淡淡的绿色,给人...
unix tcp/ip socket ddf dfdf fdfdf
这是一门不错的课程,很多同学都比较喜欢,里面讲解了一些深刻的内容。fdfdf s
这行代码表示当颜色块被点击时,更改id为"bb1"的div元素的背景颜色为"FDFDF0",并调用set_color函数,该函数将颜色值存储到cookie中。 4. JavaScript操作cookie set_color函数使用JavaScript操作cookie的功能来保存...
Console.WriteLine("fdfdf"); return c; } } } ``` 三、覆盖 覆盖指重新定义子类中与父类具有相同函数特征的的函数体。子类中有一函数和父类中函数的函数特征相同,但函数体不同,称为覆盖。这种覆盖又称为隐藏...
从给定的文件标题“我收集的 unix 命令”和描述“unix交易时,需要在数据库中记录一笔日志记录”,我们可以提取并总结出一系列重要的Unix命令及相关知识点,这些命令广泛应用于Unix系统管理、文件操作、远程访问等...
上位机开发是工业自动化系统中的重要组成部分,主要负责与下位机,如PLC(可编程逻辑控制器)进行通信,实现对设备的监控和控制。在这个过程中,上位机通常执行高级逻辑任务,而下位机则处理底层的硬件控制。...
轻量级开发的成功秘诀
的反对反对反对反对的反对反对反对反对反对的的的反对反对方
IBM 软件配置 0318 ICP.xls
很抱歉,但根据提供的信息,标题、描述和标签并没有包含任何具体的IT知识内容。它们看起来像是一个公司的联系信息和地理位置描述,而非技术性的主题。不过,如果需要关于IT行业的通用知识,我可以提供以下内容: ...