20230605 java.util.prefs.Preferences
介绍
java.util.prefs.Preferencespublic abstract class Preferences
使用属性文件有以下缺点:
- 有些操作系统没有主目录的概念, 所以很难找到一个统一的配置文件位置
- 关于配置文件的命名没有标准约定, 用户安装多个 Java 应用时,就更容易发生命名冲突
有些操作系统有一个存储配置信息的中心存储库。最著名的例子就是 Microsoft Windows 中的注册表。Preferences 类以一种平台无关的方式提供了这样一个中心存储库。在 Windows 中, Preferences 类使用注册表来存储信息;在 Linux 上, 信息则存储在本地文件系统中。当然,存储库实现对使用 Preferences 类的程序员是透明的。
Preferences 存储库有一个树状结构, 节点路径名类似于 /com/mycompany/myapp 。类似于包名, 只要程序员用逆置的域名作为路径的开头, 就可以避免命名冲突。实际上, API 的设计者就建议配置节点路径要与程序中的包名一致。
存储库的各个节点分别有一个单独的键 / 值对表, 可以用来存储数值、字符串或字节数组,但不能存储可串行化的对象。 API 设计者认为对于长期存储来说, 串行化格式过于脆弱,并不合适。当然, 如果你不同意这种看法,也可以用字节数组保存串行化对象。
为了增加灵活性,可以有多个并行的树。每个程序用户分别有一棵树;另外还有一棵系统树, 可以用于存放所有用户的公共信息。 Preferences 类使用操作系统的 “当前用户” 概念来访问适当的用户树。
若要访问树中的一个节点,需要从用户或系统根开始:
Preferences root = Preferences.userRoot();
// 或
Preferences root = Preferences.systemRoot();
然后访问节点。可以直接提供一个节点路径名:
Preferences node = root.node("/com/mycompany/myapp");
如果节点的路径名等于类的包名,还有一种便捷方式来获得这个节点。 只需要得到这个类的一个对象,然后调用:
Preferences userNode = Preferences.userNodeForPackage(this.getClass());
Preferences systemNode = Preferences.systemNodeForPackage(this.getClass());
读取信息时必须指定一个默认值, 以防止没有可用的存储库数据。 之所以必须有默认值, 有很多原因。可能由于用户从未指定过首选项, 所以没有相应的数据。某些资源受限的平台可能没有存储库, 移动设备有可能与存储库暂时断开了连接。
类似 Windows 注册表这样的中心存储库通常都存在两个问题:
- 它们会变成充斥着过期信息的 “垃圾场”
- 配置数据与存储库纠缠在一起, 以至于很难把首选项迁移到新平台
Preferences 类为第二个问题提供了一个解决方案。可以通过调用方法导出一个子树(或者比较少见的,也可以是一个节点)的首选项,数据用 XML 格式保存。也可以通过调用方法将数据导入到另一个存储库:
void exportNode(OutputStream os)
void exportSubtree(OutputStream os)
void importPreferences(InputStream is)
如果你的程序使用首选项, 要让用户有机会导出和导人首选项, 从而可以很容易地将设置从一台计算机迁移到另一台计算机。
java.util.prefs.Preferences 方法名称 |
方法声明 | 描述 |
|---|---|---|
userRoot |
static Preferences userRoot() |
返回调用程序的用户的首选项根节点 |
systemRoot |
static Preferences systemRoot() |
返回系统范围的首选项根节点 |
node |
Preferences node(String pathName) |
返回从当前节点由给定路径可以到达的节点。 如果 path 是绝对路径 (也就是说, 以一个 / 开头,) 则从包含这个首选项节点的树的根节点开始查找。 如果给定路径不存在相应的节点, 则创建这样一个节点 |
userNodeForPackage systemNodeForPackage |
static Preferences userNodeForPackage(Class<?> c) static Preferences systemNodeForPackage(Class<?> c) |
返回当前用户树或系统树中的一个节点, 其绝对节点路径对应类 cl 的包名 |
keys |
String[] keys() throws BackingStoreException |
返冋属于这个节点的所有键 |
get getInt getLong getFloat getDouble getBoolean getByteArray |
String get(String key, String def)int getInt(String key, int def)long getLong(String key, long def)float getFloat(String key, float def)double getDouble(String key, double def)byte[] getByteArray(String key, byte[] def) |
返回与给定键关联的值, 或者如果没有值与这个键关联、 关联的值类型不正确或首选项存储库不可用, 则返回所提供的默认值 |
put putInt putLong putFloat putDouble putBoolean putByteArray |
void put(String key, String value)void putInt(String key, int value)void putLong(String key, long value)void putFloat(String key, float value)void putDouble(String key, double value)void putBoolean(String key, boolean value)void putByteArray(String key, byte[] value) |
在这个节点存储一个键 / 值对 |
exportSubtree |
void exportSubtree(OutputStream os) throws IOException, BackingStoreException |
将这个节点及其子节点的首选项写至指定的流 |
exportNode |
void exportNode(OutputStream os) throws IOException, BackingStoreException |
将这个节点 (但不包括其子节点) 的首选项写至指定的流 |
importPreferences |
void importPreferences(InputStream is) throws IOException, InvalidPreferencesFormatException |
导入指定流中包含的首选项 |
浙公网安备 33010602011771号