在软件开发过程中,我们可能需要保存一些用户设置信息,方便再下次打开软件是加载这些用户设置。
之前在项目中尝试过的做法是,在指定位置保存一个文件,通过键值读取文件信息:
- ini文件
- properties文件
- xml文件
但实际上,早在JDK1.4就提供了Preferences类提供了存取注册表中的用户设定数据的机制。
注意: 我们调用Preferences同一个方法接口,在不同的平台中有不同的实现方式,有兴趣的可以去了解一下。
对应注册表 在Windows平台中,用户参数项在注册表中的根节点Preferences.userRoot()
是
HKEY_CURRENT_USER/Software/JavaSoft/Prefs
HKEY_CURRENT_USER/SOFTWARE/Wow6432Node/JavaSoft/Prefs
系统参数项在注册表中的根节点Preferences.systemRoot()
是
HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Prefs
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/JavaSoft/Prefs
而我们指定的节点路径是位于这些根节点之下的。
为了区分不同的应用程序的参数项,在建立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/cas/test");
Preferences sysData = Preferences.systemRoot().node("/com/cas/test");
以上每种方式提供了两套操作方法。其中一套是用户参数项,另一套是系统参数项。
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)
我们可以导出一个节点,或是导出整个子节点树。
import java.io.*;
import java.util.prefs.*;
public class PrefsDemo {
public static void main(String args[]) {
String keys[] = { "a", "b", "c" };
String values[] = { "1", "2", "3" };
Preferences prefsdemo = Preferences.userRoot().node("/com/cas/test");
for (int i = 0; i < keys.length; i++) {
prefsdemo.put(keys[i], values[i]);
}
try {
FileOutputStream fos = new FileOutputStream("test.xml");
prefsdemo.exportNode(fos);
} catch (Exception e) {
System.err.println("Cannot export nodes: " + e);
}
}
}