java.util.prefs.Preferences
java.util.prefs.Preferences
Preferences类是在JDK1.4中首次提供的,可以用它来存放应用程序的配置数据,这里对Preferences类做点介绍。
1、Preferences的基本概念
很多软件的菜单里都有“Setting”或“Preferences”这样的选项用来设定或修改软件的配置,这些配置信息在不同的操作系统中是存放在不同的地方的,比如,Windows操作系统中统一存储各个应用程序的配置信息的地方就是注册表,Windows下的应用程序都可以将自己的配置信息存放到注册表中。
JDK中的Preferences类也提供了一个让Java应用程序存放配置信息的统一方法,即每一个基于Java的应用程序都可以使用Preferences类存放自己的配置信息。
Preferences类是平台无关的,也就是在Windows平台上运行的Java应用程序可以用Preferences类存放配置信息,在Linux平台上运行的Java应用程序也可以使用Preferences类来存放自己的配置信息,对应用程序来说,它只管用Preferences类就好了, 不用管最终的配置信息在程序运行平台上的具体存放位置。
Preferences类将应用程序的配置信息存放在具体的操作系统平台上,具体来说,在Windows操作系统下存放在注册表中,在Linux平台下是放在使用应用程序的用户的home目录下面的一个隐藏文件中。
Preferences类用树状结构来存放应用程序的配置信息,树中的每个节点的路径名是/com/mycompany/myapp这种形式的,每个节点上都存放了一个键值对组成的表。每个应用程序可以在属于自己的节点上存放自己的配置信息,这些配置信息就构成了一个表,这个表就是节点的内容。
Preferences类有两个树,分别是系统树(它用来存放全部用户的共有信息)和用户树(它用来存放用户自己的配置信息)。在Windows操作系统下,系统树的根节点是HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs,而用户树的根节点是HKEY_CURRENT_USER\software\JavaSoft\Prefs。
这里的“系统”指的是什么,什么信息可以放在“系统树”中?什么信息可以放在“用户树”中?Preferences类的文档给出如下解释:
“The precise description of "use" and "system" will vary from implementation to implementation. Typical information stored in the user preference tree might include font choice, color choice, or preferred window location and size for a particular application. Typical information stored in the system preference tree might include installation configuration data for an application.”
2、Preferences类的用法
为了用Preferences类来存放配置信息,必须先得到用户树或系统树的根节点,然后在根节点之下建立应用程序自己的子节点,在这个子节点上存放应用程序的配置信息。
Preferecens root = Preferences.userRoot(); // 获得用户树的根节点
或者
Preferences root = Preferences.systemRoot(); // 获得系统树的根节点
获得了用户树或系统树的根节点,就可以为自己的应用程序在根节点之下创建子节点了,用自己创建的子节点来存放自己的应用程序的配置信息。
Preferences node = root.node("/com/mycompany/myapp"); // 为应用程序在用户树(或者系统树)中建立一个节点或者获得一个已有的路径名为root/com/mycompany/myapp的节点
一旦获得了节点,就可以用如下各方法访问节点包含的键值表了。
String get(String key, String defVal)
int getInt(String key, int defVal)
Long getLong(String key, long defVal)
float getFloat(String key, float defVal)
double getDouble(String key, double defVal)
boolean getBoolean(String key, boolean defVal)
byte[] getByteArray(String key, byte[] defVal)
读取配置节点的键值对的时候,必须指定默认值,以防节点中的键没有值。
同时,也可以使用如下的各方法向节点中存放配置信息。
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)
用下面的方法可以在访问节点的键值对之前,获得全部的键:
String[] keys()
还可以用下面的方法把节点中某一个键值对移去不要了:
void remove(String key)
可以用下面的方法把一个节点全部移除不要:
void removeNode()
具体的用法,可以参见下面的例子。在这个例子中应用程序在用户树下的test节点上存放了三个配置信息,然后把这个test节点的配置信息导出到test包所在的目录。
package test; import java.util.prefs.Preferences;
import java.io.FileOutputStream; public class Test
{
public static void main(String[] args) throws Exception
{
Preferences root = Preferences.userRoot();
Preferences testNode = root.node("/test"); //获取以下三个配置
int intKey = testNode.getInt("intKey", 0);
double doubleKey = testNode.getDouble("doubleKey", 0.0);
boolean booleanKey = testNode.getBoolean("booleanKey", true); //存配置
testNode.putInt("intKey", 100);
testNode.putDouble("doubleKey", 1000.01);
testNode.putBoolean("booleanKey", false);
// 导出配置
FileOutputStream out = new FileOutputStream("testConf.xml");
testNode.exportNode(out);
}
}
在Windows下编译、运行以上程序,可以在注册表的HKEY_CURRENT_USER\Software\JavaSoft\Prefs\test节点看到存储的三个配置信息,同时在test包所在的路径下可以看到testConf.xml文件,此文件的内容为导出的配置信息。testConf.xml文件的内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE preferences SYSTEM "http://java.sun.com/dtd/preferences.dtd">
<preferences EXTERNAL_XML_VERSION="1.0">
<root type="user">
<map/>
<node name="test">
<map>
<entry key="intKey" value="100"/>
<entry key="doubleKey" value="1000.01"/>
<entry key="booleanKey" value="false"/>
</map>
</node>
</root>
</preferences>
3、Preferences保存的配置信息的导入导出
Preferences类存放的配置信息还可以导出成XML文件,同时也可以将XML文件中的配置信息导入到指定的节点中。有了这个导入导出的功能,就可以在将这些配置信息从一台机器迁移到另外一台机器了。
用如下方法导出配置信息,导出的数据以XML格式存储:
void exportSubtree(OutputStream out) // 将一个节点及其下级子树都导出
void exportNode(OutputStream out) // 只导出一个节点所存储的键值对表
用如下方法导入:
void importPreferences(InputStream in)
4、其他问题及参考资料
根据以上的介绍足可以用Preferences类来存储配置信息了,当然想要进一步了解,还可以参考java.util.prefs包中各个类的说明文档。
以上内容参考了java.util.prefs.Preferences类的文档和《CoreJava》10.8.3的内容。
java.util.prefs.Preferences的更多相关文章
- (转)p解决 java.util.prefs.BackingStoreException 报错问题
原文:https://blog.csdn.net/baidu_32739019/article/details/78405444 https://developer.ibm.com/answers/q ...
- 解决Warning Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.
系统:Ubuntu 16.04 LTS 环境:vscode+java extension pack打开了一个gradle的java项目:另外,用一个terminal启动了groovysh 报错: gr ...
- Linux系统下启动tomcat报错【java.util.prefs.BackingStoreException: Couldn't get file lock】的解决方法
Linux环境下,启动tomcat报出如题的警告信息,虽然对系统正常使用没有多大影响,但是会导致tomcat的日志垃圾信息很多,而且看起来很不爽... 具体的警告信息如下: Jan , :: PM j ...
- 在eclipse中启动项目报java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
在我们启动项目的时候经常会出现内存溢出这个错误 设置一下内存就ok 错误信息 java.util.concurrent.ExecutionException: java.lang.OutOfMemo ...
- 【转】java.util.Arrays.asList 的用法
DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...
- Java程序日志:java.util.logging.Logger类
一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...
- Android中使用java.util.Properties犯的错
今天尝试使用java.util.Properties来保存应用配置,然而遇到了好几个问题,对于熟悉此内容的来说可能都是猪一样的错误,但难免有像我一样的新手再次遇到,希望此文能有所帮助. 错误1 jav ...
- java.util.ConcurrentModificationException 解决办法(转载)
今天在项目的中有一个需求,需要在一个Set类型的集合中删除满足条件的对象,这时想当然地想到直接调用Set的remove(Object o)方法将指定的对象删除即可,测试代码: public cla ...
- java util 下的concurrent包
------------------------------------------java util 下的concurrent包--------并发包--------------------.jav ...
随机推荐
- 降低Redis内存占用
1.降低redis内存占用的优点 1.有助于减少创建快照和加载快照所用的时间 2.提升载入AOF文件和重写AOF文件时的效率 3.缩短从服务器进行同步所需的时间 4.无需添加额外的硬件就可以让redi ...
- 【CNMP系列】VIM编辑器详解
缘起 大学的时候做过Linux内核驱动程序研发,之前写C语言就是用的Vim编辑器,当年的Vim还不如今天之强大,当时的插件也没有现在这么多,只是觉得这个编辑器能满足我想要的所有,查看Linux内核代码 ...
- Linux下安装Java(JDK8)
一.文件准备 1.1 文件名称 jdk-8u121-linux-x64.tar.gz 1.2 下载地址 http://www.oracle.com/technetwork/java/javase/do ...
- 如何使用ArcGIS发布LiDAR 点云
LiDAR--Light Detection And Ranging,即激光探测与测量技术. 下面将介绍如何使用ARCGIS来发布LiDAR的成果点云数据. LiDAR的点云数据一般格式为LAS.在A ...
- Mesos+Zookeeper+Marathon+Docker分布式集群管理最佳实践
参考赵班长的unixhot以及马亮blog 笔者QQ:572891887 Linux架构交流群:471443208 1.1Mesos简介 Mesos是Apache下的开源分布式资源管理框架,它被称为分 ...
- String 类的实现(2)深度拷贝详解
我们已经知道了浅拷贝存在的问题,即多次析构同一空间.这个问题是类的成员函数引起的,就是前面浅拷贝里相当于编译器自动合成的函数,确切的说,浅拷贝里的问题是由隐士拷贝构造函数和隐士赋值运算符引起的. 拷贝 ...
- JavaEE开发之Spring中的多线程编程以及任务定时器详解
上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...
- Windows下Nginx的安装与使用(一):配置端口转发
什么是端口转发 当我们在服务器上搭建一个图书以及一个电影的应用,其中图书应用启动了 8001 端口,电影应用启动了 8002 端口.此时如果我们可以通过: localhost:8001 //图书 lo ...
- CSS如何实现圆角的outline效果?
一.首先,outline是个很牛逼的东西 温故而知鑫,10年的时候写过一篇可用性方面的文章:“页面可用性之outline轮廓外框的一些研究”,还算挺有用的:3年之后,也就是13年,介绍了个没什么使用价 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合
日常啰嗦 本来这一篇和接下来的几篇是打算讲一下JDBC和数据库优化的,但是最近很多朋友加我好友也讨论了一些问题,我发现大家似乎都是拿这个项目作为练手项目,作为脚手架来用的,因此呢,改变了一下思路,JD ...