我试图了解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<?>)
???)和最终用户之间的关系感到困惑。所以我问:每个构造函数/工厂方法的作用与另一个不同,何时使用每个?
提前致谢!
答案 0 :(得分:3)
是的,数据是持久的。不,它不会必然将它们写入文件。存储方法是实现定义的,它可以将它们存储在远程数据库,注册表或二进制文件附带的实际文件中。在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注册表,您都可以获得更清晰的结构。
答案 1 :(得分:1)
注意新的Preferences()受到保护,它只能由子类实例化。
userNodeForPackage和systemNodeForPackage根据您提供的API java doc中描述的约定从路径中获取首选项。
userRoot和systemRoot是位于用户路径或系统路径的节点,这在您提供的API java doc的第一段中也有描述