- 浏览: 897394 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (498)
- J2EE (52)
- 数据库 (17)
- java基础 (43)
- web技术 (19)
- 程序设计 (6)
- 操作系统 (18)
- IT资讯 (7)
- 我的IT生活 (12)
- 学习笔记 (9)
- Jquery (25)
- JavaScript (18)
- spring (40)
- Hibernate (12)
- Struts (10)
- YUI (2)
- Extjs (22)
- .net (0)
- Eclipse (10)
- 社会主义 (2)
- 服务器 (9)
- CSS (8)
- 网络安全 (16)
- 版本控制 (9)
- PHP (2)
- Oracle (42)
- SQL server (1)
- Mysql (11)
- 项目管理 (3)
- 开发工具使用 (10)
- SQL语句 (7)
- Perl (0)
- Shell (6)
- 漏洞 (4)
- ibatis (5)
- hacker (2)
- SQL注入 (6)
- Hacker工具 (2)
- 入侵和渗透 (7)
- 插件/组件 (2)
- 最爱开源 (5)
- 常用软件 (2)
- DOS (1)
- HTML (2)
- Android (9)
- CMS (1)
- portal (8)
- Linux (7)
- OSGI (1)
- Mina (5)
- maven (2)
- hadoop (7)
- twitter storm (2)
- sap hana (0)
- OAuth (0)
- RESTful (1)
- Nginx (4)
- flex (1)
- Dubbo (1)
- redis (1)
- springMVC (1)
- node.js (1)
- solr (2)
- Flume (1)
- MongoDB (2)
- ElasticSearch (1)
最新评论
-
M_drm:
请问要怎么设置浏览器才不报没权限呢?
用JS在页面调用本地可执行文件的方法(ACTIVEX) -
Alexniver:
官方文档。When importing data into I ...
mysql导入数据过慢 解决方法 -
camelwoo:
我记得 Criteria 可以做连接查询与子查询,也可以做分页 ...
Hibernate总结篇二 -
zhenglongfei:
楼主如果SubKeyName 这个节点不存在,怎么办??怎么用 ...
Java操作注册表 -
yxx676229549:
用log4j 2 了
logback
java读写注册表需要用到两种方式:
1. java.util.prefs.* 中的包
其中 Preferences.systemRoot() 得到的是 HKEY_LOCAL_MACHINE\Software\JavaSoft\prefs 可以在此位置之下方便的进行注册表的读写
Preferences.userRoot() 得到的是 HKEY_LOCAL_USER\Software\JavaSoft\prefs,可以在此位置下进行注册表的读写,
但是对其他位置操作就不方便,因为定死了root只能在以上两个位置。这种方法唯一的缺点就是不可以选择在注册表的哪个节点下写入键值!
示例代码:
执行代码的结果会在 HKEY_LOCAL_MACHINE\Software\JavaSoft\prefs\javaplayer 位置插入三个键值
2. 开源读写注册表的库 registry-3.1.3 主页地址:http://www.trustice.com/java/jnireg/index.shtml
下载后需要将ICE_JNIRegistry.dll放到目前正在用的 jdk的bin目录下
下面是调用的示例代码:
//获得注册表中 HKEY_LOCAL_MACHINE\SOFTWARE\ARMS 的位置
RegistryKey registryKey = Registry.openSubkey(Registry.HKEY_LOCAL_MACHINE, "SOFTWARE\\ARMS",RegistryKey.ACCESS_ALL);
//获得该该key对应的值
RegistryValue registryValue = registryKey.getValue(key);
result = new String(registryValue.getByteData()).toString();
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) 删除一个命名的值。
0static 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。
最后我们来看一个代码示例:
创建的注册表项如图所示:
输出结果为:
subKey1Value
subKey2Value
说明:我的体会“第一步:把下载下来的jar包加载到工程内,第二步,把与jar包在一起的dll文件拷贝到你jdk安装目录下\jre\bin文件夹下”
1. java.util.prefs.* 中的包
其中 Preferences.systemRoot() 得到的是 HKEY_LOCAL_MACHINE\Software\JavaSoft\prefs 可以在此位置之下方便的进行注册表的读写
Preferences.userRoot() 得到的是 HKEY_LOCAL_USER\Software\JavaSoft\prefs,可以在此位置下进行注册表的读写,
但是对其他位置操作就不方便,因为定死了root只能在以上两个位置。这种方法唯一的缺点就是不可以选择在注册表的哪个节点下写入键值!
示例代码:
import java.util.prefs.*; public class Registery { Private String[] keys = {"aaa", "bbb", "ccc"}; //键名称 Prevate String[] values = {"1", "2", "3"}; //键值 Private String def="Read the key we have a Problem" //读取对应键值不成功返回的默认值 //把相应的值储存到变量中去 public void writeValue() { // HKEY_LOCAL_MACHINE\Software\JavaSoft\prefs下写入注册表值. Preferences pre = Preferences.systemRoot().node("/javaplayer"); for (int i = 0; i < keys.length; i++) { pre.put(keys[i], values[i]); } } //读取对应的键值 public void readValue(){ // HKEY_LOCAL_MACHINE\Software\JavaSoft\prefs下读取注册表值. Preferences pre = Preferences.systemRoot().node("/javaplayer"); for (int i = 0; i < keys.length; i++) { pre.get(keys[i], def); } } //判断是否有节点 public boolean nodeExists(String nodeName){ Preferences pre = Preferences.systemRoot();//.node("/javaplayer");//节点 try{ return pre.nodeExists(nodeName); }catch(Exception e){ e.printStackTrace(); return false; } } public static void main(String[] args) { Registery reg = new Registery(); reg.writeValue(); reg.readValue(); } }
执行代码的结果会在 HKEY_LOCAL_MACHINE\Software\JavaSoft\prefs\javaplayer 位置插入三个键值
2. 开源读写注册表的库 registry-3.1.3 主页地址:http://www.trustice.com/java/jnireg/index.shtml
下载后需要将ICE_JNIRegistry.dll放到目前正在用的 jdk的bin目录下
下面是调用的示例代码:
//获得注册表中 HKEY_LOCAL_MACHINE\SOFTWARE\ARMS 的位置
RegistryKey registryKey = Registry.openSubkey(Registry.HKEY_LOCAL_MACHINE, "SOFTWARE\\ARMS",RegistryKey.ACCESS_ALL);
//获得该该key对应的值
RegistryValue registryValue = registryKey.getValue(key);
result = new String(registryValue.getByteData()).toString();
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) 删除一个命名的值。
0static 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; public class JNIRegistryTest { 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
说明:我的体会“第一步:把下载下来的jar包加载到工程内,第二步,把与jar包在一起的dll文件拷贝到你jdk安装目录下\jre\bin文件夹下”
评论
2 楼
zhenglongfei
2013-07-18
楼主如果SubKeyName 这个节点不存在,怎么办??怎么用registry-3.1.3 来判断??
1 楼
kindherated
2011-07-25
群主,你导入的到底是那个jar包呢,可以说明白点不?
发表评论
-
List对象排序通用方法
2014-07-29 09:21 993在数据库中查出来的列 ... -
EJBCA环境搭建
2014-04-03 17:31 1048EJBCA开发者 http://wiki.ejbca.org/ ... -
Java & Eclipse 相关内容杂记及技巧
2013-11-26 22:42 10111、Eclipse 的启动画面 A、加启动参数。如: ... -
一套貌似很牛B的Nutch相关框架视频教程
2013-10-24 09:16 1064国内首套免费的《Nutch相关框架视频教程》(1-20) ht ... -
memcached实现多个tomcat 共享一个session(转)
2013-04-23 09:49 824http://dqm926.iteye.com/blog/18 ... -
logback
2013-01-23 09:40 1229http://yuri-liuyu.iteye.com/blo ... -
位运算
2012-11-21 17:50 921程序中的所有数在计算 ... -
HashMap的2中遍历方式比较
2012-11-20 11:47 961http://smallnetvisitor.iteye.co ... -
SVN如何强制在提交时要求添加注释说明(windows平台)
2012-11-06 18:00 3587在项目库的hooks目录下,添加一个pre-commit.ba ... -
Java虚拟机读写其他进程的数据
2012-08-22 13:07 1094Java虚拟机读写其他进程的数据 http://axiang ... -
java计算校验和:对“消息头+会话头+事务头+操作信息”按32位异或,对异或结果取反后的值为校验和。
2012-08-14 17:41 3503java计算校验和:对“消 ... -
java中对Byte字符数组定长截取的方法
2012-08-14 16:33 2070今天在在处理从网络上接收到的字符串,因为是从后台C语言过来的一 ... -
CAS单点登录配置笔记
2012-08-14 16:31 1050转:http://blog.csdn.net/lifvc/ar ... -
hadoop安装与配置
2012-08-10 11:46 1316一、安装准备 1、下载hadoop 0.21.0,地址:ht ... -
集中各种好网站
2012-08-09 16:41 9331.开源中国---在线工具: http://www.oscto ... -
人脸检测算法库 jViolajones 使用示例代码
2012-08-09 16:32 1645jViolajones是人脸检测算法Viola-Jones的一 ... -
JQuery上传插件Uploadify详解及其中文按钮解决方案
2012-08-08 18:02 0官网: http://www.uploadify.com/do ... -
用java流方式判断文件类型
2012-08-08 17:57 0全文转载:http://rainsilence.iteye.c ... -
Java简单的网络爬虫实现
2012-08-08 10:19 2463最近在学习搜索方面的东西,需要了解网络爬虫方面的知识,虽然有很 ... -
java网络编程之TCP/IP ——SocketServer与Socket
2012-08-08 10:20 2216java网络编程主要包含4部分: (注意设置超时时间) 1. ...
相关推荐
Java操作注册表插件
NULL 博文链接:https://swordinhand.iteye.com/blog/1855217
JAVA操作注册表的示例,给需要的朋友。。。。。。。。。。。
java操作注册表的一个比较全面的例子,愿抛砖引玉,对大家有所帮助!
教你怎么操作注册表,下了就知道操作注册表了。
最新java操作注册表的com.ice.jni.registry依赖压缩包
JRegistry 1.8 java操作注册表 最新资料 (推荐) 含有我封装的 util类 可以实现开机启动 和 软件配置
Java 访问注册表所需要用到的架包regist.jar
java 对windows 下注册表的操作 添加 删除 各个键值等等
Java操作windows注册表的一点点教程希望对你有用
Java调用操作注册表jar包进行注册表相关操作的资料,很全
Windows操作系统提供了操作注册表的API,因此用JNI将Java和这些API连接起来我们就获得了用Java操作注册表的能力。com.ice.jni.registry包是通过JNI(Java native interface)实现的Windows注册表操作API,可以用来访问...
在windows中操作注册表的jar包和dll,适合32位和64位操作系统,采用JNI调用方式,无缝操作注册表
Download JRegistry-1.7.4b_src-bin_x86-64.zip (223.2 KB) ,包含了源码和文档!
使用Java操作Windows注册表
用Java操作Windows注册表,对注册表的写和读。
Java通过注册表获取IE代理设置(附源码),绝对值得下载
使用java对windows系统的注册表操作,修改各种需要的信息!
registry.jar java操作注册表开源库 registry3.1.3.jar 包含源码以及ICE_JNIRegistry.dll和registry.jar