20230605 java.util.prefs.Preferences

发布时间 2023-08-28 09:51:41作者: 流星<。)#)))≦

介绍

  • java.util.prefs.Preferences
  • public 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 导入指定流中包含的首选项