原文地址:「java.util.prefs.Preferences」(永久地址,保存网址不迷路 🙃)
作用
Properties提供的应用程序解决方案主要存在两个问题:
(1)配置文件不能放在主目录中,因为某些OS(如Win9X)没有主目录的概念;
(2)没有标准的文件命名规则,存在文件名冲突的可能性。
Java中的Preferences类可以解决这些问题。Preferences提供一个存储配置信息的中心知识库,与平台无关。
Preferences的中心知识库是树状结构,因此可以避免文件名冲突。每个用户都有一棵树,存放与本用户有关的配置;还有一个系统树,存放全体用户的公共信息。内部的配置信息仍然以key-value的结构进行存储。
使用方法
Preferences的使用步骤如下:
(1)获得根节点
Preferences root = Preferences.userRoot();
Preferences root = Preferences.systemRoot();
如果配置信息位于用户树,则获取用户树的根节点,否则获取系统树根节点;
(2)获取配置节点
preferences = root.node("path");
path是配置节点相对于根节点的路径;
如果节点的路径名与类的包名相同,则可通过类的对象直接获得配置节点:
Preferences node = Preferences.userNodeForPackage(this.getClass());
Preferences node = Preferences.systemNodeForPackage(this.getClass());
(3)读取配置项
String title = preferences.get("title", "default title");
Preferences要求读取配置项时必须指定默认值。因为在实际环境中总会有各种不如意,比如系统中还没有中心知识库,或者网络暂时不可用等等。
(4)设置配置项
preferences.put(key, value);
(5)同步配置项
preferences.flush();
flush()方法用于立即将配置项写入到文件中。
示例
JDK1.4为我们提供的java.util.prefs包,里面有一个Preferences类,能让以上的工作变得极其轻松!
写VB程序的人常常用SaveSetting函数和getSettging来存取注册表中的用户设定数据。而Java的Preferences类也提供了类似的机制。
Preferences类在不同的平台中有不同的实现方式。而在Windows平台中,Preferences是将数据保存在注册表中的,而在其它平台中的实现我就不得而知了(我对Linux等系统都不太了解).
建立Preferences对象
为了区分不同的应用程序的参数项,在建立Preferences时要指定一个节点路径。
Preferences是一个抽象类,提供了一系列静态方法和抽象方法来操作参数项:
抽象方法:
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");
以上每种方式提供了两套操作方法。其中一套是用户参数项,另一套是系统参数项。
如何读写数据
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)
我们可以导出一个节点,或是导出整个子节点树.
数据存储路径
在Windows系统中,它存储在注册表中。用户参数(userRoot)项在注册表中的根节点是
而系统参数(systemRoot)项在注册表中的根节点是
所以,我们指定的节点路径是位于这些根节点之下的。
在Linux系统中,存储在本地文件系统中。用户参数(userRoot)项存储在
而系统参数(systemRoot)项存储在
注意,对于Unix,可以通过指定“java.util.prefs.userRoot”和“java.util.prefs.systemRoot”属性来更改存储的位置。
但不管怎样,任何平台下的Preferences类都是通过相同的接口来使用的,开发者可以不用去关心具体的实现细节。
参考文献
ITEYE/java.util.prefs.Preferences
Java-Preferences用法-入门
【JAVA学习笔记】个人设定
Where are the Java preferences stored in Windows 7?
Preference API storage