我们经常需要将我们的程序中的设定,如窗口位置,开启过的文件,用户的选项设定等数据记录下来,以做便用户下一次开启程序能继续使用这些数据。

以前我们通常的做法是使用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是将数据保存在注册表中的,而在其它平台中的实现我就不得而知了(我对Linux等系统都不太了解).
但不管怎样,都是通过相同的接口来使用的,程序作者可以不管实现细节。

建立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.FileOutputStream;
import java.util.prefs.BackingStoreException;
import java.util.prefs.PreferenceChangeEvent;
import java.util.prefs.PreferenceChangeListener;
import java.util.prefs.Preferences;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");// 为这个Preferences对象添加监听,监听首选项的改变prefsdemo.addPreferenceChangeListener(new PreferenceChangeListener() {@Overridepublic void preferenceChange(PreferenceChangeEvent evt) {System.out.println(evt.getKey()+" = "+evt.getNewValue());}});/* 储存参数项 */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) {}*/}}

java.util.prefs.Preferences相关推荐

  1. 使用java.util.prefs.Preferences代替java.util.Properties

    典型的应用程序安装程序需要向用户询问几个选项,其中一些是配置问题,例如,应用程序应在其上运行的端口,应如何运行等.应用程序必须记住这些选项,并在每个选项中使用它们.跑. 解决此问题的标准方法是将这些选 ...

  2. java.util.prefs.Preferences用法

    我们经常需要将我们的程序中的设定,如窗口位置,开启过的文件,用户的选项设定等数据记录下来,以做便用户下一次开启程序能继续使用这些数据. 以前我们通常的做法是使用Properties类,它提供以下方法: ...

  3. Couldn‘t flush user prefs: java.util.prefs.BackingStoreException: Couldn‘t get file lock

    最近在部署秒杀项目的时候,部署完以后,发现项目报错,如下: 文章目录 问题详情 解决方法 ulimit常用命令 问题详情 Waiting for possible Shutdown/StopTestN ...

  4. java.util.prefs.WindowsPreferences <init>异常警告

    java.util.prefs.WindowsPreferences WARNING: Could not open/create prefs root node Software\JavaSoft\ ...

  5. 在java.time.LocalDateTime和java.util.Date之间进行转换

    本文翻译自:Converting between java.time.LocalDateTime and java.util.Date Java 8 has a completely new API ...

  6. 将java.util.Date转换为java.time.LocalDate

    本文翻译自:Convert java.util.Date to java.time.LocalDate What is the best way to convert a java.util.Date ...

  7. 为什么不使用java.util.logging?

    本文翻译自:Why not use java.util.logging? For the first time in my life I find myself in a position where ...

  8. java.util.Collections.synchronizedSet()方法的使用

    下面的例子显示java.util.Collections.synchronizedSet()方法的使用 package com.;import java.util.*;public class Col ...

  9. java.util.concurrent包API学习笔记

    newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...

最新文章

  1. python书籍_python书籍购买建议
  2. 面试题目集锦--二叉树
  3. 深入理解C/C++二维数组
  4. php进程学习(一)
  5. php socket keepalive,linux keepalive探测对应用层socket api的影响
  6. 【Win10】UAP/UWP/通用 开发之 x:Bind
  7. 160308_Helloworld_Console Application
  8. Xml的编码和Bom
  9. python中按照文件夹中文件的排列顺序读取文件内容
  10. Django学习笔记之Ajax入门
  11. 这文字的起始位置_如何用AE快速制造文字特效视频的效果?3分钟教你学会
  12. cad插件物料自动排版_IMEX NO.63:园林景观专业CAD图库
  13. c语言messagebox多窗口,C语言messagebox用法
  14. 天猫魔盘在ubuntu16.04中的使用
  15. Windows徽标键的使用
  16. MTI Further
  17. GPU会变得更便宜吗?GPU 定价更新
  18. 【前端开发】Vue + Fabric.js + Element-plus 实现简易的H5可视化图片编辑器
  19. launchctl mysql_【数据库】MAC 使用mysqldump 和 launchctl 定时备份Mysql数据库
  20. 信息系统开发与管理【五】之 系统分析

热门文章

  1. 一篇文章普及各种ios基本知识(防止奸商忽悠、鉴别假冒翻新机、知识入门必备)
  2. hive 结构metastone_深入理解hive之事务处理
  3. 初中教师资格证计算机试讲教案模板,教案模板:教师资格证面试初中英语万能教案模板...
  4. 富文本++php+源码,自己实现富文本编辑器
  5. Java中如何引用文档对象模型_在JAVA中使用文档对象模型DOM经验小结
  6. 计算机一级b需要学哪些,希望通过江苏省计算机一级B考试的同学千万要看哦!江苏省计算机一级B理论复习资料(绝密资料)...
  7. linux执行python命令后permission denied
  8. H5页面随机数字键盘支付页面
  9. Java 中 String 的常用方法(二)
  10. phpize增加php模块