Java操作Windows注册表

来源:互联网 发布:翻唱 谭咏麟的知不知 编辑:程序博客网 时间:2024/05/15 06:27

注册表包含 Windows 在运行期间不断引用的信息,例如,每个用户的配置文件、计算机上安装的应用程序以及每个应用程序可以创建的文档类型、文件夹和应用程序图标的属性表设置、系统上存在哪些硬件以及正在使用哪些端口。

注册表取代了 Windows 3.x 和 MS-DOS 配置文件(例如,Autoexec.bat 和 Config.sys)中使用的绝大多数基于文本的 .ini 文件。虽然几个 Windows 操作系统都有注册表,但这些操作系统的注册表有一些区别。

使用Preferences API
Preferences API并不是为访问Windows注册表而设计的,这是值得指出的一点。

我们之所以会有上面的误解是由于Sun的Windows版本的JDK在实现Preferences API时使用了Windows注册表作为存储库,即我们用Preferences API存储的数据会保存到Windows注册表中,这样Preferenes API也就有了访问Windows注册表的能力。但是换到其它的平台或其它厂商的JDK实现又会怎么样呢?这个问题是和Preferences API的实现相关的,我们没有办法回答。

如果程序不关心存储库的细节,只是要找一个存放数据的地方,那么Preferences API很合适。

Preferences API也是有局限的,请您考虑两个问题:

一个Java软件,这次我在Sun的JDK上运行并使用Preferences API保存了我的个人喜好,下次我在IBM的JDK上运行,这时我的个人喜好还可以通过Preferences API得到吗?可能可以也可能不可以,这时的行为是由Sun和IBM的Preferences API实现决定的。(在相同的JDK实现上可以使用Preferences API来在不同的程序间共享数据)
一个Java软件需要让用户设置是否和操作系统一起启动,类似的需求还很多。这类需求就是要求Java程序有真正的和相关操作系统协同的能力。这种能力不是Preferences API的设计目标。

如果您对Preferences API还不了解,那么您可能需要阅读一下这篇文章《用Preferences API存储对象》,可以从参考资料中找到。

使用Preferences API
Preferences API并不是为访问Windows注册表而设计的,这是值得指出的一点。

我们之所以会有上面的误解是由于Sun的Windows版本的JDK在实现Preferences API时使用了Windows注册表作为存储库,即我们用Preferences API存储的数据会保存到Windows注册表中,这样Preferenes API也就有了访问Windows注册表的能力。但是换到其它的平台或其它厂商的JDK实现又会怎么样呢?这个问题是和Preferences API的实现相关的,我们没有办法回答。

如果程序不关心存储库的细节,只是要找一个存放数据的地方,那么Preferences API很合适。

Preferences API也是有局限的,请您考虑两个问题:

一个Java软件,这次我在Sun的JDK上运行并使用Preferences API保存了我的个人喜好,下次我在IBM的JDK上运行,这时我的个人喜好还可以通过Preferences API得到吗?可能可以也可能不可以,这时的行为是由Sun和IBM的Preferences API实现决定的。(在相同的JDK实现上可以使用Preferences API来在不同的程序间共享数据)
一个Java软件需要让用户设置是否和操作系统一起启动,类似的需求还很多。这类需求就是要求Java程序有真正的和相关操作系统协同的能力。这种能力不是Preferences API的设计目标。

如果您对Preferences API还不了解,那么您可能需要阅读一下这篇文章《用Preferences API存储对象》,可以从参考资料中找到。
RegistryKey的方法概要:

方法 简短描述

Java代码 复制代码
  1. void closeKey() 关闭该subkey。   
  2. RegistryKey connectRegistry(java.lang.String hostName) 连接远程主机hostName的注册表。   
  3. RegistryKey createSubKey(java.lang.String subkey, java.lang.String className) 创建和打开该key的subkey,具有写权限。   
  4. RegistryKey createSubKey(java.lang.String subKey, java.lang.String className, int access) 创建和打开该key的subkey,具有指定的权限。   
  5. int decrDoubleWord(java.lang.String valueName) 该方法将消减REG_DWORD的值。   
  6. void deleteSubKey(java.lang.String subKey) 删除该subkey。   
  7. void deleteValue(java.lang.String valueName) 删除一个命名的值。   
  8. static java.lang.String expandEnvStrings(java.lang.String exString) 展开exString中的环境变量。   
  9. void export(java.io.PrintWriter out, boolean descend) 导出key。   
  10. void finalize() 重载了的finalize()方法,确保能够关闭key。   
  11. void flushKey() 确保这个key被写到磁盘,对性能有一定的影响。   
  12. java.lang.String getDefaultValue() 得到该key的默认值。   
  13. java.lang.String getFullName() 得到key的全名。   
  14. int getMaxSubkeyLength() 得到所有subkey名称的最大长度。   
  15. int getMaxValueDataLength() 得到所有subkey值的最大长度。   
  16. int getMaxValueNameLength() 得到所有值的名称的最大长度。   
  17. java.lang.String getName() 得到该key的名称。   
  18. int getNumberSubkeys() 得到subkey的数量。   
  19. int getNumberValues() 得到值的数量。   
  20. java.lang.String getStringValue(java.lang.String valueName) 得到REG_SZ或REG_EXPAND_SZ的值。   
  21. RegistryValue getValue(java.lang.String valueName) 得到valueName的值。   
  22. boolean hasDefaultValue() 判断该key是否有默认值。   
  23. boolean hasOnlyDefaultValue() 判断该key是否只有默认值。   
  24. int incrDoubleWord(java.lang.String valueName) 该方法将增强REG_DWORD的值。   
  25. java.util.Enumeration keyElements() 枚举该key的subkey的名称。   
  26. RegistryKey openSubKey(java.lang.String subkey) 打开该key的subkey,具有读权限。   
  27. RegistryKey openSubKey(java.lang.String subKey, int access) 打开该key的subkey,具有指定的权限。   
  28. java.lang.String regEnumKey(int index) 得到该key在index处的subkey。   
  29. java.lang.String regEnumValue(int index) 得到该key在index处的subkey的值。   
  30. void setCreated(boolean created) 设置该key的created状态。   
  31. void setValue(RegistryValue value) 设置该key的值。   
  32. void setValue(java.lang.String valueName, RegistryValue value) 设置valueName的值。   
  33. java.util.Enumeration valueElements() 枚举该key的值的名称。   
  34. boolean wasCreated() 判断该key是被opened还是被created和opened。   



最后我们来看一个代码示例:

Java代码 复制代码
  1. package org.solol.test;   
  2.   
  3. import com.ice.jni.registry.NoSuchKeyException;   
  4. import com.ice.jni.registry.RegStringValue;   
  5. import com.ice.jni.registry.Registry;   
  6. import com.ice.jni.registry.RegistryException;   
  7. import com.ice.jni.registry.RegistryKey;   
  8.   
  9. /**
  10. * @author solo L
  11. *
  12. */  
  13. public class JNIRegistryTest {   
  14.   
  15.   /**
  16.     * @param args
  17.     */  
  18.   public static void main(String[] args) {   
  19.     //创建注册表项并设置相应的值   
  20.     try {   
  21.        RegistryKey software = Registry.HKEY_LOCAL_MACHINE.openSubKey("SOFTWARE");   
  22.   
  23.        RegistryKey subKey = software.createSubKey("SubKeyName", "");   
  24.   
  25.        subKey.setValue(new RegStringValue(subKey, "subKey1", "subKey1Value"));   
  26.        subKey.setValue(new RegStringValue(subKey, "subKey2", "subKey2Value"));   
  27.        subKey.closeKey();   
  28.      } catch (NoSuchKeyException e) {   
  29.        e.printStackTrace();   
  30.      } catch (RegistryException e) {   
  31.        e.printStackTrace();   
  32.      }   
  33.      
  34.     //打开注册表项并读出相应的值   
  35.     try {   
  36.        RegistryKey software = Registry.HKEY_LOCAL_MACHINE.openSubKey("SOFTWARE");   
  37.        RegistryKey subKey = software.openSubKey("SubKeyName");   
  38.        String subKey1Value = subKey.getStringValue("subKey1");   
  39.        String subKey2Value = subKey.getStringValue("subKey2");   
  40.        System.out.println(subKey1Value);   
  41.        System.out.println(subKey2Value);   
  42.        subKey.closeKey();   
  43.      } catch (NoSuchKeyException e) {   
  44.        e.printStackTrace();   
  45.      } catch (RegistryException e) {   
  46.        e.printStackTrace();   
  47.      }      
  48.    }   
  49. }  

在Java中操作Windows注册表registry-3.1.3.zip压缩包解开后ICE_JNIRegistry.dll文件应该放在哪里位置?(not installed the DLL named 'ICE_JNIRegistry.DLL'.)

RROR You have not installed the DLL named 'ICE_JNIRegistry.DLL'.
no ICE_JNIRegistry in java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: openSubKey
at com.ice.jni.registry.RegistryKey.openSubKey(Native Method)
at com.ice.jni.registry.RegistryKey.openSubKey(RegistryKey.java:185)

对于这个问题可以把'ICE_JNIRegistry.DLL' 放在classpath中即可,我就直接放在了 java_home的文件夹中,可以运行了

菊子曰 本文用菊子曰发布