4

我试图了解不同的构造函数是如何java.util.prefs.Preferences工作的,并且不确定在不同场景下使用哪些构造函数。

一方面,是否Preferences将首选项/属性保存到文件中?换句话说,我可以使用这个类在我的应用程序运行中存储首选项,还是所有内容都保存在内存中?

至于构造函数,只有几种方法可以实例化 a Preferences

Preferences p = new Preferences();
Preferences p = Preferences.userNodeForPackage(this.getClass());
Preferences p = Preferences.userRoot();

这些构造函数的API 文档如下(分别):

唯一的构造函数。

从调用用户的首选项树中返回与指定类的包相关联的首选项节点(按照约定)。

返回调用用户的根首选项节点。

所以我想我对不同Preferences实例、Java 类(useNodeForPackage(Class<?>)???)和最终用户之间的关系感到困惑。所以我问:每个构造函数/工厂方法与另一个有什么不同,以及何时使用它们?

提前致谢!

4

2 回答 2

5

“一方面,首选项是否将首选项/属性保存到文件中?”

是的,数据是持久的。不,它不一定将它们写入文件。存储方法是实现定义的,它可以将它们存储在远程数据库、注册表或二进制文件随附的实际文件中。在 Windows 上,默认实现写入注册表。(这写在您链接的 API 文档的顶部)

“每个构造函数/工厂方法的作用与其他方法有何不同,以及何时使用它们?”

Preferences p = new Preferences();

正如@ojota84 在他们的帖子中提到的那样,这不能直接调用,它被以下工厂方法使用:

Preferences p = Preferences.userNodeForPackage(this.getClass());

这允许Preferences实现返回一个Preferences特定于给定类的对象,并且不会干扰其他类的首选项。在 Windows 上,这通常会返回一个Preferences对象,该对象将密钥存储到HKU\Software\JavaSoft\Prefs\myapplication\myclass\. 在 XML 支持的文件中,这可能对应于<myapplication><myclass>-data here-</myclass></myapplication>.

Preferences p = Preferences.userRoot();

这与上述类似,但返回所有用户首选项的根对象。如果您将偏好视为排列成一棵树。那么这是有道理的。在 Windows 上,这通常使用HKU\Software\JavaSoft\Prefs\myapplication\. XML 类比是您将访问<myapplication>-data here-</myapplication>.

userRoot()在和 之间选择userNodeForPackage()

从本质上讲,这是一个偏好问题(双关语不是故意的)。如果您只需要存储一两个键,userRoot()将在您的注册表中创建较少的条目。如果您需要编写大量密钥,那么userNodeForPackage()避免名称冲突和其他问题可能会更好。无论是 XML 文件、数据库还是 Windows 注册表,您都可以在支持您的偏好的任何内容中获得更清晰的结构。

于 2013-09-01T13:36:11.267 回答
1

注意 new Preferences() 受到保护,它只能由子类实例化。

userNodeForPackage 和 systemNodeForPackage 根据您提供的API Java 文档中描述的约定从路径获取首选项。

userRoot 和 systemRoot 是位于用户路径或系统路径的节点,这也在您提供的API java doc的第一段中进行了描述

于 2013-05-03T14:43:09.733 回答