我们经常需要将我们的程序运行中的一些信息(比如在选项对话框中的设置)记录下来,以做便再次运行的时候不用再重写填写这些数据。这对改善软件的人机可用性方面是很有用的。但是让人失望的是,现在很多java开源软件在这一点做的很不好,每次运行都要用户去填写那些配置文件。做为最好用的数据库监控、日志工具,jdbmonitor在这方面做的是非常好的,以它的swing界面监视器和数据库日志记录查询窗口中所有的配置信息(例如远程服务器地址、端口、数据库名称、jdbc驱动等等)都是被保存的,当再次运行的时候程序会自动加载这些配置信息,所以使用起来相当方便。
我们接下来就来分析一下jdbmonitor是如何实现的。jdbmonitor的二进制jar包和源代码都可以从 http://www.cownew.com 下载得到。
保存加载配置文件有多种方式,比如xml文件、properties文件等,采用这些保存方式的一个问题就是如果程序是以jar,war 包等方式发布的那么这些配置文件就不能放在包中,因为包中的文件是不能在运行时改动的,只能放在磁盘的文件中,但是放在磁盘的文件中又很容易出现因为操作系统的差异、权限等问题造成程序的问题。jdbmonitor采用的则是jdk中的preferences类来避免这些问题。
jdk1.4中提供了preferences类,在java.util.prefs包里面。preferences类在不同的平台中有不同的实现方式。比如在windows平台中,preferences是将数据保存在注册表中的。
为了区分不同的应用程序的参数项,在建立preferences时要指定一个节点路径。
preferences是一个抽象类,提供了一系列静态方法和抽象方法来操作参数项:
preferences userdata = preferences.usernodeforpackage(this); //得到用户配置节点
preferences sysdata = preferences.systemnodeforpackage(this); //得到系统配置节点。
比如在windows中preferences.usernodeforpackage代表得到 hkey_current_user\software\javasoft\prefs下的相对路径
preferences.systemnodeforpackage代表得到 hkey_local_machine\software\javasoft\prefs下的相对路径
preferences的读取、存储是非常容易的,存储只要调用put***方法就可以,读取调用get***即可,不同的put,get方法分别用于存取不同的数据类型,详细信息可以参考javadoc。
以jdbmonitor的swing界面监视器的连接对话框为例为大家分析,打开com.cownew.jdbmonitor.listenerimpl.scklistenerclient.connectconfigdialog,saveconfig()和loadconfig()分别就是保存和读取参数用了,这两个方法会在超类中被调用。可以看到代码实现非常简单:
protected void saveconfig()
{
preferences prefer = preferences.usernodeforpackage(getclass());
prefer.put(host_name,gethostname());
prefer.putint(port,getport());
}
protected void loadconfig()
{
preferences prefer = preferences.usernodeforpackage(getclass());
sethostname(prefer.get(host_name,""));
setport(prefer.getint(port,9527));
}
闽公网安备 35060202000074号