下载地址:registry.jar
http://www.trustice.com/java/jnireg/index.shtml
使用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文件夹下”
转自:http://www.blogjava.net/jimmy/archive/2008/09/20/230097.html
相关推荐
本篇文章将详细介绍如何利用Java来操作注册表,并介绍一个名为"JAVA操作注册表的神器"的工具。 首先,我们要知道,Java的标准库并不包含直接操作注册表的功能。为了在Java中操作注册表,我们需要借助一些第三方库,...
"Java操作注册表插件"就是这样的工具,它允许Java程序与Windows注册表进行交互。 在Java中,直接操作注册表并不像在C++或C#等语言中那样简单直接,因为Java的标准库并不包含对注册表的原生支持。为了实现这个功能,...
Java 操作注册表是开发者在特定场景下可能需要用到的功能,比如配置管理、系统设置等。在 Windows 操作系统中,注册表是存储系统和应用程序设置的关键数据库。通过 Java 来操作注册表,我们可以实现跨平台的程序在 ...
Java操作注册表时,通常会访问这些根键下的特定分支,如`HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs`或`HKEY_CURRENT_USER\Software\JavaSoft\Prefs`,用于存储与Java应用相关的配置信息。 #### 二、Java操作...
总的来说,通过Java操作注册表可以帮助我们处理特定的系统任务,但需要注意操作的安全性和适用性。在使用上述代码或方法时,一定要确保对注册表操作的合法性,并遵循最佳实践,以避免潜在的问题。
Java操作注册表的相关知识主要涉及Java的本地方法调用(JNI)或使用第三方库来访问Windows操作系统中的注册表。注册表是Windows系统中存储配置信息的重要数据库,它包含了硬件、软件、用户设置等各种数据。在Java中...
Java操作注册表通常涉及到在Java程序中与Windows操作系统底层交互,以便读取、修改或创建注册表项。这里提到的`com.ice.jni.registry`是一个Java库,它提供了这样的功能,利用JNI(Java Native Interface)技术实现...
在Java编程中,操作注册表是一项相对复杂的任务,因为Java本身并不直接支持对Windows注册表的访问。然而,我们可以通过一些第三方库或者JNA(Java Native Access)来实现这一功能。下面将详细介绍如何使用Java来操作...
Java操作注册表是Java开发中一项实用但不常见的任务,主要涉及到系统级别的设置和管理。JRegistry库就是专为此目的设计的,版本1.8提供了对Windows注册表的简便访问和操作。在这个压缩包中,你将找到关于如何使用...
《JRegistry-1.7:Java操作注册表的利器》 在软件开发中,与操作系统进行交互是必不可少的一部分,尤其是在Windows环境下,注册表是存储系统配置信息的关键数据库。JRegistry是一个专门为Java开发者设计的库,它...
Java 访问注册表所需要用到的架包regist.jar
总结来说,jRegistryKey是一个通过JNI连接Java和Windows注册表的库,提供了跨平台的Java代码操作注册表的功能。它的设计考虑了32位和64位系统的兼容性,简化了Java开发者在Windows环境下的系统级编程。正确使用这个...
在这个场景中,我们需要关注的核心知识点是Java如何与Windows系统进行交互,特别是如何访问和操作注册表。 注册表是Windows操作系统中的一个重要数据库,存储了系统的配置信息,如软件设置、硬件设备信息等。Java...
Windows操作系统提供了操作注册表的API,因此用JNI将Java和这些API连接起来我们就获得了用Java操作注册表的能力。com.ice.jni.registry包是通过JNI(Java native interface)实现的Windows注册表操作API,可以用来访问...
Java 操作注册表主要涉及到 `java.util.prefs` 包中的 `Preferences` 类,这是一个用于存储用户和系统首选项的接口。从 JDK 1.4 开始,Java 提供了这个包来支持跨平台的首选项存储,允许开发者在不依赖特定操作系统...
Java是一种广泛使用的编程语言,它通常不直接支持操作系统级别的功能,比如读取Windows注册表,因为这违背了Java跨平台的哲学。然而,通过Java的本地接口(JNI)或者使用Java的Runtime类来执行系统命令,可以实现...
同时,"另附jRegistryKey的操作API使用说明"表明该软件可能使用了名为jRegistryKey的库来操作注册表,这个库提供了Java API来访问和修改注册表项,对于学习Java与注册表交互的开发者来说,这部分资料尤为珍贵。...
"Java修改注册表"这个主题涉及到的是如何使用Java来操作Windows系统的注册表,这是一个相对复杂的任务,因为注册表是操作系统的核心组成部分,存储了系统配置、软件设置等关键信息。下面将详细介绍如何在Java中实现...