浅谈Java读写注册表的方式Preferences与jRegistry

本文研究的主要是Java 读写注册表的两种方式 Preferences 与 jRegistry的相关内容,具体介绍如下。

由于java程序是“write once, run everywhere”,用java读写注册表,那程序的跨平台性就差了。java对注册表的操作,在jdk1.4以前的版本中,那是不可能的,只能用JNI来实现;然而jdk1.4之后提供的prefs包可以操作windows注册表,不过定死了root只在SOFTWARE/JavaSoft/prefs下,估计也是出于这种两难吧,又要保证所谓平台无关,还要照顾大家对windows的依赖。下面将从两方面来介绍对注册表的操作。

一、 使用JDK提供的Preferences类

首先得到Preferences的一个对象,这个对象就规定了你要在注册表的哪个位置写入信息,即节点.然后再用put(String key,String value)或者putInt(),tDouble()…等来给有关项赋值。下面是Demo程序。

import java.util.prefs.*;
public class Registery {
  String[] keys = {"version", "initial", "creator"};
  String[] values = {"1.3", "ini.mp3", "caokai1818@sina.com"};
 //把相应的值储存到变量中去
  public void writeValue() {
 // HKEY_LOCAL_MACHINE\Software\JavaSoft\prefs下写入注册表值.
    Preferences pre = Preferences.systemRoot().node("/javaplayer");
    for (int i = 0; i < keys.length; i++) {
      pre.put(keys, values);
    }
  }
  public static void main(String[] args) {
    Registery reg = new Registery();
    reg.writeValue();
  }
} 

执行上面的代码则在注册表的HKEY_LOCAL_MACHINE\Software\JavaSoft\prefs\javaplayer项下写入了有关值.

最后再说明几点:

  • 你的节点的首字母不要大写,不然在注册表中的项前就加了一个“/”;
  • 注册表中的值也可以导入到一个XML文件中,具体方法见有关文档.
  • 如果把代码中的Preferences pre = Preferences.systemRoot().node("/javaplayer");换成Preferences pre = Preferences.userRoot().node("/javaplayer");则相应的 HKEY_LOCAL_MACHINE就成为HKEY_LOCAL_USER。

二、 用jRegistry 来操作注册表

jRegistry它是用JNI来封装WINDOWS注册表API,方便了java开发者访问windows注册表。首先介绍一下jRegistryKey.jar和jRegistryKey.dll,这两个文件是使用jRegistry来操作注册表所必需的文件:一个是jar包,是一个包括了java类的文件;一个是动态链接库文件,提供了访问注册表所需的本地代码(即C/C++)。

下面详细介绍一下使用流程:

  • 在JBuilder的菜单Project->Project Properties->Required Libraries中添加jRegistryKey.jar或在环境变量classpath中添加该jar文件;
  • 将jRegistryKey.dll放在工程的当前目录下;
  • 在访问注册表类中import该语句:import ca.beq.util.win32.registry.*; 该包中有两个类:RegistryKey和RegistryValue。其中RegistryKey是注册表键的java表示,它提供了creat()和delete()方法创建和删除key,枚举子键和值,set和get键的值等;RegistryValue is the Java? representation of a registry value (defined as a name, a type, and data).

实现代码

  • 创建一个新key:
RegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER,
 "Software\\BEQ Technologies");
r.create(); 
  • 创建一个子键:
RegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER, "Software");
r.createSubkey("BEQ Technologies"); 
  • 删除一个已存在的键值:
try {
  RegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER,
"Software\\BEQ Technologies");
  r.delete();
} // try
catch(RegistryException re) {
  re.printStackTrace();
} // catch 
  • 枚举子键:
RegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER, "Software");
if(r.hasSubkeys()) {
  Iterator i = r.subkeys();
  while(i.hasNext()) {
   RegistryKey x = (RegistryKey)i.next();
   System.out.println(x.toString());
  } // while
} // if 
  • 读注册表中键的值:
RegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER,
"Software\\BEQ Technologies");
if(r.hasValue("myValue")) {
  RegistryValue v = r.getValue("myValue");
  System.out.println(v.toString());//
} // if 

注:v.toString()仅是键myValue对应的键值,若要得到myValue键对应的值数据,则需要String str = v.getDate().toSting();

  • 设置注册表中键的值:
RegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER, "Software\\BEQ Technologies");
RegistryValue v = new RegistryValue("myVal", ValueType.REG_SZ, "data");
r.setValue(v); 
  • 枚举某键的所有值:
RegistryKey r = new RegistryKey(RootKey.HKEY_CURRENT_USER, "Software");
if(r.hasValues()) {
  Iterator i = r.values();
  while(i.hasNext()) {
   RegistryValue v = (RegistryValue)i.next();
   System.out.println(v.toString());
  } // while
} // if 

下面是一个demo程序,仅供参考。

// create a new key, "Test", under HKLM
RegistryKey r = new RegistryKey(RootKey.HKEY_LOCAL_MACHINE, "Test");
if(!r.exists()) {
r.create();
} // if  

// create value entries
RegistryValue v = new RegistryValue("aString", ValueType.REG_SZ, "test");
r.setValue(v); 

v.setName("aDword");
v.setType(ValueType.REG_DWORD);
v.setData(new Integer(0x1001001));
r.setValue(v); 

// read value entries
Iterator i = r.values();
while(i.hasNext()) {
v = (RegistryValue)i.next();
System.out.println(v.toString());
} // while 

// delete registry key
r.delete(); 

总结

以上就是本文关于浅谈Java读写注册表的方式Preferences与jRegistry的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

您可能感兴趣的文章:

  • 分享关于JAVA 中使用Preferences读写注册表时要注意的地方
(0)

相关推荐

  • 分享关于JAVA 中使用Preferences读写注册表时要注意的地方

    要注意的只有一个地方,那就是键名或者项名不要包含大写字母,否则读不到数据. 代码是这样的: 复制代码 代码如下: Preferences preferences = Preferences.systemRoot();String strRegTime = preferences.get("regTime", ""); 注册表中是这样的 不论怎么改都读不到regTime的值.后来想到现在代码中把值写进去看看是什么样的,代码如下 复制代码 代码如下: Preferenc

  • 浅谈Java读写注册表的方式Preferences与jRegistry

    本文研究的主要是Java 读写注册表的两种方式 Preferences 与 jRegistry的相关内容,具体介绍如下. 由于java程序是"write once, run everywhere",用java读写注册表,那程序的跨平台性就差了.java对注册表的操作,在jdk1.4以前的版本中,那是不可能的,只能用JNI来实现:然而jdk1.4之后提供的prefs包可以操作windows注册表,不过定死了root只在SOFTWARE/JavaSoft/prefs下,估计也是出于这种两难

  • 浅谈JAVA工作流的优雅实现方式

    今天查找线上问题,看到一个让我脑洞大开的工作流实现方式.以前用过责任链模式,也用过模板模式实现类工作流的方式,但是对比这个工具,逊色不少,不卖关子了,就是Apache Commons Chain,它是Command模式与责任链模式的综合体. 1.Apache Commons Chain 中的角色有:chain.context.command. 2.在我们订单系统有这样的业务,就是退票的时候,会根据核损后的订单价格,给客人退钱,但是订单的金额,由几部分组成 有现金.商旅卡.有优惠券.所以根据需求,

  • 浅谈java调用Restful API接口的方式

    摘要:最近有一个需求,为客户提供一些RestfulAPI接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试RestfulAPI接口,由于使用的是HTTPS,所以还要考虑到对于HTTPS的处理.由于我也是首次使用Java调用restful接口,所以还要研究一番,自然也是查阅了一些资料. 分析:这个问题与模块之间的调用不同,比如我有两个模块frontend和backend,frontend提供前台展示,backend提供数据支

  • 浅谈Java中的四种引用方式的区别

    强引用.软引用.弱引用.虚引用的概念 强引用(StrongReference) 强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用: Object object = new Object(); String str = "hello"; 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象. 比如下面这段代码: public class Main { publi

  • 浅谈Java的两种多线程实现方式

    本文介绍了浅谈Java的两种多线程实现方式,分享给大家.具有如下: 一.创建多线程的两种方式 Java中,有两种方式可以创建多线程: 1 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2 通过实现Runnable接口,实例化Thread类 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. 程序1

  • 浅谈java中String的两种赋值方式的区别

    类似普通对象,通过new创建字符串对象.String str = new String("Hello"); 内存图如下图所示,系统会先创建一个匿名对象"Hello"存入堆内存(我们暂且叫它A),然后new关键字会在堆内存中又开辟一块新的空间,然后把"Hello"存进去,并且把地址返回给栈内存中的str, 此时A对象成为了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收. 直接赋值.如String str = "Hello&

  • 浅谈Java获得多线程的返回结果方式(3种)

    一:Java创建线程方式 继承Thread类或者实现Runnable接口. 但是Runnable 的 run() 方法是不带返回值的,那如果我们需要一个耗时任务在执行完之后给予返回值,应该怎么做呢? 第一种方法:在 Runnable 的实现类中设置一个变量 V,在 run 方法中将其改变为我们期待的结果,然后通过一个 getV() 方法将这个变量返回. package com.test.thread; import java.util.*; import sun.swing.Accumulati

  • 浅谈java对象之间相互转化的多种方式

    第一种:使用org.apache.commons.beanutils.PropertyUtils.copyProperties()拷贝一个bean中的属性到另一个bean中,第一个参数是目标bean,第二个参数是源bean. 特点: 1.它的性能问题相当差 2.PropertyUtils有自动类型转换功能,而java.util.Date恰恰是其不支持的类型 3.PropertyUtils支持为null的场景: public static void copyProperties(Object de

  • 浅谈Java HttpURLConnection请求方式

    一)URL代理请求 ​ 该方式请求有两种代理方式. 方式一:使用该方式代理之后,之后的所有接口都会使用代理请求 // 对http开启全局代理 System.setProperty("http.proxyHost", "192.168.1.1"); System.setProperty("http.proxyPort", "80"); // 对https开启全局代理 System.setProperty("https.

  • 浅谈Java中File文件的创建以及读写

    1.创建一个文件 @Test public void test6() throws IOException { File file1 = new File("C:\\IDEA\\h1.txt"); if(!file1.exists()){//文件不存在 file1.createNewFile(); System.out.println("创建成功"); }else{//文件存在 file1.delete(); System.out.println("删除成

随机推荐