文档章节

使用JNIRegistry操作Windows注册表

F风向标F
 F风向标F
发布于 2013/06/26 16:29
字数 1174
阅读 948
收藏 13

    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 

JNIRegistry操作注册表时,如果键值项有中文会出现乱码问题,可以使用JRegistry来替换,这个项目在sourceforge上面,相关操作步骤跟上面所述不同:

                /*
		 * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
		 */
		RegistryKey run = RegistryKey.parseKey(
				"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
		RegStringValue startCCC = (RegStringValue) run.getValue("StartCCC");
		System.out.println(startCCC.getValue());
		RegStringValue value = (RegStringValue) run.newValue("Test", ValueType.REG_SZ);
		value.setValue("你好吗");
		run.copyValue(run, value);
		System.out.println(((RegStringValue) run.getValue("Test")).getValue());
		if(run.valueExists("Test")) {
			value.setValue("我很好");
			run.copyValue(run, value);
		}
		if(run.valueExists("Test")) {
			run.deleteValue("Test");
		}

© 著作权归作者所有

共有 人打赏支持
上一篇: Spring MVC 简介
下一篇: Spring JDBC Demo
F风向标F
粉丝 10
博文 31
码字总数 14470
作品 0
郑州
程序员
私信 提问
wince注册表结构

与桌面Windows一样,Windows CE也使用注册表(Registry)来保存应用程序、驱动程序和用户的设定以及其他一些配置信息。Windows CE注册表也采用树形结构来管理配置信息,由于Windows CE注册表...

技术小胖子
2017/11/16
0
0
ProcessMonitor文件以及注册表监视器的使用

近期有个关于离线安装软件修改windows注册表的工作,基于这个工作,首先要搞明白在线安装软件时,windows注册表都做了哪些修改以支持软件的安装运行,这里我选择了ProcessMonitor来进行监视。...

yousss
12/11
0
0
确定系统设置在注册表对应路径

windows系统中,注册表是个非常强大的系统编辑工具,几乎系统所有环境设置和变量都在注册表有对应的项和值。那么,对于任意一个系统设置,我们该如何知道其在注册表对应的路径和值呢? 在这里...

liuhx2
2017/02/16
0
0
Windows7中必须清除的招人讨厌功能

由于Vista出师不利,微软把全部精力都放在Windows 7的研发之上了。微软也 试图利用Windows 7打一个漂亮的翻身仗,一扫Vista给微软带来的负面影响。为了达到这个效果,微软必须要清除之前的W...

老枪
2009/08/28
1K
6
Explorer.EXE进程自动重启的故事

很早就发现一个奇怪的现象了,如果你使用任务管理器杀死Explorer.EXE,Windows不会将Explorer.EXE自动唤起,但是如果你自己使用TerminateProcess() 函数结束Explorer.EXE进程,你会发现一个奇...

伽罗kapple
2016/01/21
286
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 钱不还,我就当你人不在了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享Bigleaf的单曲《小鹿》 《小鹿》- Bigleaf 手机党少年们想听歌,请使劲儿戳(这里) 周日在家做什么? 做手工呀, @poorfis...

小小编辑
40分钟前
13
2
EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
17
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
23
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
25
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部