我试图了解 java.util.prefs.Preferences 的不同构造函数是如何工作的,但不确定在不同场景下使用哪些构造函数。
一方面, Preferences 是否将首选项/属性保存到文件中? 换句话说,我可以使用这个类在我的应用程序运行中存储首选项,还是所有内容都保存在内存中?
至于构造函数,只有几种方法可以实例化 Preferences :

Preferences p = new Preferences();
Preferences p = Preferences.userNodeForPackage(this.getClass());
Preferences p = Preferences.userRoot();
这些构造函数的 API docs 如下(分别):

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

最佳答案

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

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

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

Preferences p = new Preferences();

这不能像@ojota84 在他们的帖子中提到的那样直接调用,它被下面的工厂方法使用:
Preferences p = Preferences.userNodeForPackage(this.getClass());

这允许 Preferences 实现返回一个特定于给定类的 Preferences 对象,并且不会干扰其他类的首选项。在 Windows 上,这通常会返回一个 Preferences 对象,该对象将 key 存储到 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() 将在您的注册表中创建更少的条目。如果您需要编写大量 key ,那么 userNodeForPackage() 可能会更好,因为您可以避免名称冲突和其他问题。您还可以在支持您的首选项的任何内容中获得更清晰的结构,无论是 XML 文件、数据库还是 Windows 注册表。

关于Java util Preferences 构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16361188/

10-10 20:21