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 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");
以上每种方式提供了两套操作方法。其中一套是用户参数项,另一套是系统参数项。
如何读写数据
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)项在注册表中的根节点是
**HKEY_CURRENT_USER\Software\JavaSoft\Prefs**
而系统参数(systemRoot)项在注册表中的根节点是
**HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs**
所以,我们指定的节点路径是位于这些根节点之下的。
在Linux系统中,存储在本地文件系统中。用户参数(userRoot)项存储在
**${user.home}/.java/.userPrefs/**
而系统参数(systemRoot)项存储在
**/etc/.java**
注意,对于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