Preferences 与 注册表

Preferences API在底层到底使用的存储机制,依赖于具体情况。Preferences API允许不同的存储层次来存储原始数据,称为辅助存储器。为Preference节点提供的缺省的后台存储依赖于运行代码的系统:对于MS Windows,缺省的后台存储是注册表
example:
(下面注释掉的那段代码给恢复, 就能把写入的注册键值删除, 很方便啊) 
至于读注册表项, 比写还方便, 查JDK API文档吧.. 
// PrefsDemo.java 
import java.io.*; 
import java.util.prefs.*; 
public class PrefsDemo { 
public static void main(String args[]) 

  String keys[] ={"sunway","copyright","author"}; 
  String values[] ={"sunway technology company","copyright 2002","turbochen@163.com"}; 
  /* 建立一个位于user root下的/com/sunway/spc节点参数项*/ 
  Preferences prefsdemo =Preferences.userRoot().node("/com/sunway/spc"); 
  /* 储存参数项*/ 
  for (int i=0 ; i < keys.length; i++) 
  { 
   prefsdemo.put(keys, values); 
  } 
  /* 导出到XML文件 */ 
  try 
  { 
   FileOutputStream fos = new FileOutputStream("prefsdemo.xml"); 
   prefsdemo.exportNode(fos); 
  } catch (Exception e) 
  { 
   System.err.println("Cannot export nodes: " + e); 
  } 
  /* 去掉注释可以清除注册表中的参数项*/ 
  /*try 
  { 
   prefsdemo.removeNode(); 
  } catch (BackingStoreException e) 
  { 
  }*/ 


  
备注:
用Preferences来管理首选项数据 
来自http://java.csdn.net/page/41f5be4f-5a81-4cea-bbdb-4789a1226012
从JDK 1.4开始,提供了新的java.util.prefs.Preferences(及其相关的)类,它能够为保存首选项数据提供一个不错的解决方案。
使用Preferences API非常直观,如下面代码所示:
//All Preferences classes come from java.util.prefs
//Read a configuration value
Preferences prefs = Preferences.systemNodeForPackage(this.getClass()); 
String url = prefs.get("databaseURL", ""); 
Preferences API会区分系统数据和用户数据。系统首选项数据作用在整个机器范围内,通常存储的典型信息可能包括应用程序的安装配置等数据,并由所有用户共享。而用户首选项数据则针对每个用户,并随当前用户的不同而改变,通常存储的典型信息可能包括特定应用程序的字体选择、颜色选择和首选窗口的位置及大小等。
Preferences以层次节点的方式组织,类似于XML Infoset元素。通过把节点放入不同层次的包中,首选项元素可以被划分成不同的可管理块,以便于进行管理。Preferences API具有一些工具方法,可以遍历Preferences树以查找与类的包名匹配的Preferences节点。一旦发现了正确的Preferences节点,就能够得到与键“databaseURL”关联的值;如果没有发现这个键,就会返回缺省值,这个值将作为方法调用的第二个参数被返回,其目的是,为了保证内部存储不可用时,应用程序也可以正常运行。
Preferences API在底层到底使用的存储机制,依赖于具体情况。Preferences API允许不同的存储层次来存储原始数据,称为辅助存储器。为Preference节点提供的缺省的后台存储依赖于运行代码的系统:对于MS Windows,缺省的后台存储是注册表;在UNIX 系统中,大部分Java 虚拟机依然使用文本文件,存储在用户的本地目录或整个机器的/etc 或/user/etc目录,这取决于该系统的Java 虚拟机和UNIX 文件系统的具体规范。
首选项树的每个节点都具有一个节点名(不必是唯一的)、一个唯一的绝对路径名和一个相对于每个祖先(包括它自己)的路径名。根节点的节点名为空字符串("")。每个其他节点的节点名可以在创建时任意指定。此名称的唯一限制是,它不能是空字符串,也不能包含斜杠字符('/')。根节点的绝对路径名为 "/"。根节点的子节点的绝对路径名是 "/" + <节点名>。所有其他节点的绝对路径名是<父节点的绝对路径名> + "/" + <节点名>。
注意: 
·任何相对路径名的第一个字符都不能是斜杠。 
·每个节点相对于自身的路径名都是空字符串。 
·每个节点相对于父节点的路径名就是其节点名,根节点除外,因为它没有父节点。 
·每个节点相对于根的路径名都是其移除开头斜杠的绝对路径名。 
·任何路径名均不能包含多个连续的斜杠字符。 
·任何路径名均不能以斜杠字符结尾,根的绝对路径名除外。
Preferences API除了能够存储字符串之外,还能够存储字节数组,这对于存储可序列化的对象非常方便。此外,Preferences API 还允许我们注册事件回调实例(实现PreferencesChangeListener接口的类),当发生修改Preferences数据的事件时,这些实例将被调用。通过这一机制,可以使得当首选项数据发生改变时不需要重启服务器来使修改生效,即给与我们实时配置应用程序的能力。
如果不想把数据存储在Windows注册表或本地的文件系统中,可以使用自定义的Preference类,从而把数据写入到其它地方,包
括关系型数据库或LDAP服务器。这里的自定义Preference类必须继承自AbstractPreferences。
每个Preferences实现都必须具有一个关联的PreferencesFactory实现。每个Java(TM) SE实现都必须提供一些方式,来指定将哪个 PreferencesFactory 实现用于生成根首选项节点。这允许管理员使用替代实现替换默认首选项实现。 
实现注意事项:在 Sun 的 JRE 中,PreferencesFactory 实现的位置如下:
1、如果定义了系统属性java.util.prefs.PreferencesFactory,则该属性名就会用作实现PreferencesFactory接口的类的完全限定名。加载并实例化该类;如果此进程失败,则抛出未指定的错误。
2、如果在对系统类加载器可见的jar文件中安装了PreferencesFactory实现类文件,并且该jar文件在资源目录META-INF/services中包含名为java.util.prefs.PreferencesFactory的提供者配置文件,则采用在该文件中指定的第一个类名称。如果提供了一个以上这样的jar文件,则使用找到的第一个文件。加载并实例化该类;如果此进程失败,则抛出未指定的错误。
3、最后,如果既没有提供上述系统属性也没有提供扩展jar文件,则加载和实例化底层平台的系统级默认PreferencesFactory实现。
修改首选项数据的所有方法都允许进行异步操作;它们可能立即返回,但是更改最终将传播到持久内部存储中,其延迟取决于实现。可以使用flush方法同步地将更新强制同步到内部存储中。Java虚拟机的正常终止不会 导致挂起更新的丢失,即在终止时不需要进行显式flush调用来使挂起更新变得持久。单个JVM中的多个线程可以同时调用此类中的方法,无需进行外部同步,其结果等效于某些顺序执行。如果在同一个内部存储中存储其首选项数据的多个JVM同时使用此类,则数据存储也不会遭到破坏,但首选项数据的一致性难以得到保证。
用Preferences API还可以将首选项数据导出成XML格式,也可以从XML或其他类似的结构中导入数据。通过这种方式可以在机器间方便地传递首选项数据,也可以对首选项数据进行备份和恢复。
其XML文档的DOCTYPE声明如下:
注意,导入或导出首选项时不访问系统URI(http://java.sun.com/dtd/preferences.dtd);该系统URI仅作为一个唯一标识DTD的字符串: 





type (system|user) #REQUIRED >


name CDATA #REQUIRED >



key CDATA #REQUIRED
value CDATA #REQUIRED >

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值