服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java的秘密:将应用程序的设定存在哪里


  我们经常需要将我们的程序中的设定,如窗口位置,开启过的文件,用户的选项设定等数据记录下来,以做便用户下一次开启程序能继续使用这些数据。以前我们通常的做法是使用properties类,它提供以下方法:
  
  void load(inputstream instream)
  void store(outputstream out, string header)
  string getproperty(string key,
  string defaultvalue)
  string getproperty(string key)
  
  这些方法让我们很容易的存取设定数据。另外的办法是使用resourcebundle这个类来储存设定数据,甚至有些程序作者使用一个自定结构的文件来储存设定数据。但不管怎样,最让程序作者头痛的是:我该将这些数据保存在哪?
  
  现在好了,jdk1.4为我们提供的java.util.prefs包,里面有一个preferences类,能让以上的工作变得极其轻松!
  
  写vb程序的人常常用savesetting函数和getsettging来存取注册表中的用户设定数据。而java的preferences类也提供了类似的机制。
  
  preferences类在不同的平台中有不同的实现方式。而在windows平台中,preferences是将数据保存在注册表中的。
  
  建立preferences对象
  
  为了区分不同的应用程序的参数项,在建立preferences时要指定一个节点路径。preferences是一个抽象类,提供了一系列静态方法和抽象方法来操作参数项:
  
  抽象方法:
  
  preferences userdata =
  preferences.usernodeforpackage(this);
  preferences sysdata =
  preferences.systemnodeforpackage(this);
  
  这两个方法是从指定的物件所在的包(package)返回一个节点路径,如this是javax.swing.jcomponent,则返回/javax/swing
  
  静态方法:
  
  preferences userdata =
  preferences.userroot()
  .node("/com/sunway/spc");
  preferences sysdata =
  preferences.systemroot()
  .node("/com/sunway/spc");
  
  以上每种方式提供了两套操作方法。其中一套是用户参数项,另一套是系统参数项。在windows平台中,用户参数项在注册表中的根节点是
  
  hkey_current_user/software/javasoft/prefs
  
  系统参数项在注册表中的根节点是
  
  hkey_local_machine/software/javasoft/prefs
  
  而我们指定的节点路径是位于这些根节点之下的。
  
  如何读写数据
  
  preferences提供了多种类型数据的读写方法。先来看写(put)的方法:
  
  put(string key, string value)
  putboolean(string key, boolean value)
  putbytearray(string key, byte value[])
  putdouble(string key, double value)
  putfloat(string key, float value)
  putint(string key, int value)
  putlong(string key, long value)
  
  下面的是读(get)的方法:
  
  get(string key, string default)
  getboolean(string key, boolean default)
  getbytearray(string key, byte default[])
  getdouble(string key, double default)
  getfloat(string key, float default)
  getint(string key, int default)
  getlong(string key, long default)
  
  注意,每一种get方法的第二个参数需要我们为它指定缺省的参数。除了以上方式之外,preferences还允许我们将它的数据导出到一个xml文件保存:
  
  void exportnode(outputstream os)
  void exportsubtree(outputstream os)
  
  我们可以导出一个节点,或是导出整个子节点树。
  
  preferences的一个演示以上的讲解足可以写一个示例来看看preferences是如何为我们工作的,看看下面的例子:
  
  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[i], values[i]);
  }
  
  /* 导出到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)
  {
  } */
  
  }
  }

扫描关注微信公众号