JDK1.4下实现会见WIN32注册表
副标题#e#
为 Java 1.4 增加的 java.util.prefs 包,通过提供对特定于实现的注册表(譬喻,Windows 平台上的 Windows 注册表)的会见本领,使您可以或许操纵用户首选项数据和设置数据。
您是不是曾经需要生存措施的设置数据但却不知应将数据存储在那边? 固然您可以利用属性文件或资源束获取这些信息,但 Java 平台从未指定过用于存储这些文件的尺度位置。JSR 10 呈现后一切都变了,它为 Java 1.4 API 提供增加的 java.util.prefs 包。存储机制是特定于实现的细节,但措施员不必知道,也不必劳神。对付 Windows 平台,它的位置是在“Windows 注册表”。 您固然不可以或许对注册表自由节制,但您简直可以通过一个民众根节点会见所有的应用措施。
开始
定名很得当的 Preferences 类提供操纵首选项的根基框架。这个类提供了一系列静态和抽象要领来操纵两套首选项(个中一套是用户首选项,另一套是系统首选项)中的个中一套。 利用静态要领,您会获得一个特定于平台的实现,就象 WindowsPreferences 类; 然后您可以利用由这个特定于平台的实现实现的抽象要领来做这项事情。
用包将措施的首选项分组是个好习惯,可以制止与其它应用措施的定名斗嘴。 当您查找 Preferences 工具时,只需通报包的名称。在利用非静态要领时, 您可以通报对自身的引用(this),措施将为您确定查找的是哪个包,如清单 1 所示。
清单 1. 从非静态要领获取 Preferences 工具
Preferences userPrefs = Preferences.userNodeForPackage(this);
Preferences sysPrefs = Preferences.systemNodeForPackage(this);
可是,假如您利用的是静态要领,您就必需获得根节点并本身提供包,如清单 2 所示。
清单 2. 从静态要领获取 Preferences 工具
Preferences userPrefs = Preferences.userRoot().node("/net/zukowski/ibm");
Preferences sysPrefs = Preferences.systemRoot().node("/net/zukowski/ibm");
有了举办操纵的节点后,您就可以轻松地配置、获取、撤除和转储配置选项。只要把 Preferences 工具看成一个大的键 — 值散列表(这个表把树形布局中的键组织起来)。可它不是“荟萃框架”( Collections Framework)的部件,(关于“荟萃框架”的更多信息,请参阅参考资料)。
写数据
我们将从接头如何存储首选项开始。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)
所有的 put() 要领都返回一个 void。假如存储机制不行用,将抛出一个BackingStoreException。
留意:一个特定首选项的键长度被限制为 Preferences.MAX_KEY_LENGTH(80)个字符,而它的值被限制为 Preferences.MAX_VALUE_LENGTH(8192)个字符。
#p#副标题#e#
读数据
可通过下面所示的一系列 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)
假如您对首选项名称不确定,您可以用 keys() 要领查找一列与节点相关联的键。这个要领返回节点的 String[]。 除获取和存储个体首选项以及获取一列要害字之外,您还可以用 clear()、remove() 和 removeNode() 撤除节点和值。
转储数据
假如您想在系统提供的备用存储器之外生存和规复首选项,您可以在 XML 名目标文档中执行这些操纵。您可以用 exportNode() 导出一个节点或用 exportSubtree() 导出整个子树。信息以 UTF-8 名目存储。然后,当您想规复信息时,可利用 importPreferences() 要领。
侦听
“好奇心会害死一只猫”,但假如您对弄排除首选项何时改变很感乐趣,您可以注册一个 NodeChangeListener 或 PreferenceChangeListener,而不思量随之而来的效果。NodeChangeListener 认真通知您节点被添加和撤除的时间, 而 PreferenceChangeListener 汇报您值的变革。这些都紧随着根基 JavaBeans 组件事件用 add/removeNodeChangeListener(NodeChangeListener) 和 add/removePreferenceChangeListener() 要领处理惩罚布局之后产生。根基上,您先实现侦听器,然后注册侦听器,这样您会发明未来的变革。
完整的示例
#p#分页标题#e#
真的就这些。清单 3 为您提供了一个完整的示例来试验新成果(也可从参考资料下载)。措施运行后会本身排除,所以假如您想在注册表中找到值,请注释掉措施尾部的排除代码。
清单 3. 完整的示例
package net.zukowski.ibm;
import java.io.*;
import java.util.prefs.*;
public class Prefs {
public static void main(String args[]) {
String denominations[] =
{"One", "Two", "Five", "Ten", "Twenty"};
String pictures[] =
{"Washington", "Jefferson", "Lincoln", "Hamilton", "Jackson"};
NodeChangeListener nodeChangeListener =
new NodeChangeListener() {
public void childAdded(NodeChangeEvent event) {
Preferences parent = event.getParent();
Preferences child = event.getChild();
System.out.println(parent.name() + " has a new child " +
child.name());
}
public void childRemoved(NodeChangeEvent event) {
Preferences parent = event.getParent();
Preferences child = event.getChild();
System.out.println(parent.name() + " lost a child " +
child.name());
}
};
PreferenceChangeListener preferenceChangeListener =
new PreferenceChangeListener() {
public void preferenceChange(PreferenceChangeEvent event) {
String key = event.getKey();
String value = event.getNewValue();
Preferences node = event.getNode();
System.out.println(node.name() + " now has a value of " +
value + " for " + key);
}
};
// Look up user root
Preferences prefs =
Preferences.userRoot().node("/net/zukowski/ibm");
// Add listeners
prefs.addNodeChangeListener(nodeChangeListener);
prefs.addPreferenceChangeListener(preferenceChangeListener);
// Save a bunch of key-value pairs
for (int i=0, n=denominations.length; i < n; i++) {
prefs.put(denominations[i], pictures[i]);
}
// Display all the entries
try {
String keys[] = prefs.keys();
for (int i=0, n=keys.length; i < n; i++) {
System.out.println(keys[i] + ": " + prefs.get(keys[i], "Unknown"));
}
} catch (BackingStoreException e) {
System.err.println("Unable to read backing store: " + e);
}
// Create child
Preferences child = Preferences.userRoot().node("/net/zukowski/ibm/foo");
// Save to XML file
try {
FileOutputStream fos = new FileOutputStream("prefs.out");
prefs.exportNode(fos);
} catch (Exception e) {
System.err.println("Unable to export nodes: " + e);
}
// Clean up
try {
prefs.removeNode();
} catch (BackingStoreException e) {
System.err.println("Unable to access backing store: " + e);
}
}
}