使用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
分享到:
相关推荐
在提供的压缩包文件中,有一个名为`WinRegistry.java`的文件,这可能是一个实现了注册表操作的Java类。根据其命名推测,这个类可能是用JNA或者JReg库封装的,提供了诸如读取、写入、删除注册表键值等方法。我们可以...
7. **权限管理**:由于注册表操作可能涉及系统的敏感信息,因此在进行读写时,需要注意权限问题。可以使用 `RegistryKey.setPermissions(String user, int access)` 设置访问权限。 8. **异常处理**:由于操作...
Z平台在这里可能指的是一个特定的开发环境或者框架,它可能提供了集成的Java注册表操作支持,使得在该平台上使用Java进行注册表操作更为简便。具体来说,Z平台可能为开发者提供了一些预定义的API或类库,简化了与reg...
Java语言在处理操作系统级别的任务时,虽然不如C++或Python那样直接,但通过特定的库和API,也可以实现对Windows注册表的读取。在这个场景中,我们需要关注的核心知识点是Java如何与Windows系统进行交互,特别是如何...
对于追求高效、灵活的注册表操作的应用程序来说,尽管GD API的初期投入较高,但长期来看,其提供的功能性和稳定性优势明显。 #### 三、实践建议 在实际项目中,选择合适的注册表操作方法应基于具体的需求和环境: ...
其中一个常用的库是`Apache Commons RegEx`,但这个库并不直接支持注册表操作。更常见的是使用JNA,这是一个Java平台的本地接口库,允许Java代码直接调用操作系统API,包括Windows注册表的函数。 以下是一个简单的...
Java是一种广泛使用的编程语言,它通常不直接支持操作系统级别的功能,比如读取Windows注册表,因为这违背了Java跨平台的哲学。然而,通过Java的本地接口(JNI)或者使用Java的Runtime类来执行系统命令,可以实现...
总结起来,这个压缩包提供了一个完整的Java注册表清理工具的源码、文档和执行文件,对于学习Java编程、注册表操作以及系统维护的开发者和学生来说,这是一个宝贵的资源。通过分析和实践这个项目,不仅可以深入理解...
请注意,修改注册表操作必须谨慎,因为错误的操作可能导致系统不稳定甚至崩溃。在进行任何修改之前,确保备份重要数据,并且了解你正在操作的键和值的影响。 在项目中使用Java修改注册表,需要考虑以下几点: - ...
Java 操作 Windows 注册表 Java 语言是一种跨平台的编程语言,但是在实际的编程中,我们经常需要在 Windows 平台下操作注册表,以存储软件的有关信息。那么,究竟可以使用 Java 来操作 Windows 的注册表吗? 答案...
"基于Java的注册表操作类 jared.zip" 提供了一个实用的解决方案,它包含一个或多个Java类,专门设计用于简化注册表的交互。这个压缩包可能包含了名为 "jared_011" 的源代码文件或类库,可能是作者或开发者用来实现...
在IT领域,尤其是在系统维护和优化的过程中,"(java)注册表清理"是一个常见的任务,主要是为了提升系统性能和稳定性。注册表是Windows操作系统的核心组件,存储着系统和应用程序的各种配置信息。随着时间的推移,...
1. **JNA(Java Native Access)库**:由于Java本身不支持直接访问操作系统级别的功能,如读写注册表,所以我们需要借助于像JNA这样的库。JNA允许Java代码与本地操作系统API交互,无需编写C/C++的中间层。 2. **JNA...
Java 访问注册表所需要用到的架包regist.jar
首先,`jRegistryKey.dll`是一个Windows平台下的动态链接库,它提供了底层的注册表操作功能。在Java中,我们不能直接调用C/C++编写的DLL函数,因此需要通过Java Native Interface (JNI) 来桥接Java代码和DLL。JNI...
在Java编程语言中,操作注册表通常是用于读取、写入或修改系统设置,这些设置存储在Windows操作系统中。...在使用上述代码或方法时,一定要确保对注册表操作的合法性,并遵循最佳实践,以避免潜在的问题。
JAVA源码Java注册表操作类jared
在Java编程环境中,有时我们需要对Windows系统的注册表进行读写操作,这在处理特定的系统配置或应用程序设置时尤其有用。Java从JDK 1.4版本开始...同时,建议在进行注册表操作时,确保有适当的权限控制和错误处理机制。
在Java编程环境中,有时我们需要对Windows系统的注册表进行读写操作,例如配置软件设置、修复系统问题或收集系统信息。Windows注册表是一个存储操作系统和应用程序配置数据的重要数据库。本篇文章将详细探讨如何使用...
这个类提供了如`HKEY_CURRENT_USER`、`HKEY_LOCAL_MACHINE`等常量,以及`RegOpenKeyEx`、`RegQueryValueEx`等方法,它们对应于Windows API的注册表操作函数。 以下是一个简单的示例,展示了如何使用JNA读取注册表...