`
dreamoftch
  • 浏览: 496083 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java操作注册表

阅读更多

下载地址: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 



参考资料

说明:我的体会“第一步:把下载下来的jar包加载到工程内,第二步,把与jar包在一起的dll文件拷贝到你jdk安装目录下\jre\bin文件夹下”

 

转自:http://www.blogjava.net/jimmy/archive/2008/09/20/230097.html

分享到:
评论

相关推荐

    JAVA操作注册表的神器

    本篇文章将详细介绍如何利用Java来操作注册表,并介绍一个名为"JAVA操作注册表的神器"的工具。 首先,我们要知道,Java的标准库并不包含直接操作注册表的功能。为了在Java中操作注册表,我们需要借助一些第三方库,...

    Java操作注册表插件

    "Java操作注册表插件"就是这样的工具,它允许Java程序与Windows注册表进行交互。 在Java中,直接操作注册表并不像在C++或C#等语言中那样简单直接,因为Java的标准库并不包含对注册表的原生支持。为了实现这个功能,...

    java如何操作注册表源代码

    Java 操作注册表是开发者在特定场景下可能需要用到的功能,比如配置管理、系统设置等。在 Windows 操作系统中,注册表是存储系统和应用程序设置的关键数据库。通过 Java 来操作注册表,我们可以实现跨平台的程序在 ...

    Java操作windows注册表

    Java操作注册表时,通常会访问这些根键下的特定分支,如`HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs`或`HKEY_CURRENT_USER\Software\JavaSoft\Prefs`,用于存储与Java应用相关的配置信息。 #### 二、Java操作...

    JAVA操作注册表的示例,代码简单

    总的来说,通过Java操作注册表可以帮助我们处理特定的系统任务,但需要注意操作的安全性和适用性。在使用上述代码或方法时,一定要确保对注册表操作的合法性,并遵循最佳实践,以避免潜在的问题。

    Java操作注册表相关资料

    Java操作注册表的相关知识主要涉及Java的本地方法调用(JNI)或使用第三方库来访问Windows操作系统中的注册表。注册表是Windows系统中存储配置信息的重要数据库,它包含了硬件、软件、用户设置等各种数据。在Java中...

    最新java操作注册表的com.ice.jni.registry依赖压缩包

    Java操作注册表通常涉及到在Java程序中与Windows操作系统底层交互,以便读取、修改或创建注册表项。这里提到的`com.ice.jni.registry`是一个Java库,它提供了这样的功能,利用JNI(Java Native Interface)技术实现...

    java操作注册表简单示例

    在Java编程中,操作注册表是一项相对复杂的任务,因为Java本身并不直接支持对Windows注册表的访问。然而,我们可以通过一些第三方库或者JNA(Java Native Access)来实现这一功能。下面将详细介绍如何使用Java来操作...

    JRegistry-1.8java操作注册表最新资料(推荐).rar

    Java操作注册表是Java开发中一项实用但不常见的任务,主要涉及到系统级别的设置和管理。JRegistry库就是专为此目的设计的,版本1.8提供了对Windows注册表的简便访问和操作。在这个压缩包中,你将找到关于如何使用...

    JRegistry-1.7 java操作注册表2010最新版

    《JRegistry-1.7:Java操作注册表的利器》 在软件开发中,与操作系统进行交互是必不可少的一部分,尤其是在Windows环境下,注册表是存储系统配置信息的关键数据库。JRegistry是一个专门为Java开发者设计的库,它...

    Java 访问注册表所需要用到的架包regist.jar

    Java 访问注册表所需要用到的架包regist.jar

    JAVA操作注册表的JNI库和JAR包jRegistryKey

    总结来说,jRegistryKey是一个通过JNI连接Java和Windows注册表的库,提供了跨平台的Java代码操作注册表的功能。它的设计考虑了32位和64位系统的兼容性,简化了Java开发者在Windows环境下的系统级编程。正确使用这个...

    java读取注册表信息

    在这个场景中,我们需要关注的核心知识点是Java如何与Windows系统进行交互,特别是如何访问和操作注册表。 注册表是Windows操作系统中的一个重要数据库,存储了系统的配置信息,如软件设置、硬件设备信息等。Java...

    主要原理是Java通过修改注册表实现的,简单、安全、可靠。.

    Windows操作系统提供了操作注册表的API,因此用JNI将Java和这些API连接起来我们就获得了用Java操作注册表的能力。com.ice.jni.registry包是通过JNI(Java native interface)实现的Windows注册表操作API,可以用来访问...

    java下操作注册表方法优质资料.doc

    Java 操作注册表主要涉及到 `java.util.prefs` 包中的 `Preferences` 类,这是一个用于存储用户和系统首选项的接口。从 JDK 1.4 开始,Java 提供了这个包来支持跨平台的首选项存储,允许开发者在不依赖特定操作系统...

    java读取注册表工具.zip

    Java是一种广泛使用的编程语言,它通常不直接支持操作系统级别的功能,比如读取Windows注册表,因为这违背了Java跨平台的哲学。然而,通过Java的本地接口(JNI)或者使用Java的Runtime类来执行系统命令,可以实现...

    JAVA注册表垃圾清理

    同时,"另附jRegistryKey的操作API使用说明"表明该软件可能使用了名为jRegistryKey的库来操作注册表,这个库提供了Java API来访问和修改注册表项,对于学习Java与注册表交互的开发者来说,这部分资料尤为珍贵。...

    Java修改注册表

    "Java修改注册表"这个主题涉及到的是如何使用Java来操作Windows系统的注册表,这是一个相对复杂的任务,因为注册表是操作系统的核心组成部分,存储了系统配置、软件设置等关键信息。下面将详细介绍如何在Java中实现...

Global site tag (gtag.js) - Google Analytics