大家可能经常会遇到在 Java 程序中存取程序配置文件的需求, 比如, 为了能够和不同的数据 库连接,我们经常把数据库连接的信息存放到属性文件中,这些信息一般包括数据库驱动程 序类名、数据库连接的 URL,数据库的用户名和口令等等。为了便于程序的安装或部署,我 们经常会把这些的配置文件存放到程序安装的根目录中。 由于 Java 程序用包来分组类, 有时 候将这些配置文件放入到读取它们的类所在的包目录中会更好一些。 比如, 在下面的图示中, 将数据库配置文件 database.properties 放到数据库读取类所在的包目录就是一种比较清 晰的存储方案: |-----------其它包目录 | | -------edu.ec.database | |---------------ConnectionPool(数据库连接池类) | |---------------Dao(数据库访问对象类) | |---------------DaoFactory(Dao 的工厂类) | |---------------database.properties(数据库配置属性文件) | |---------------RecordSet(记录集类) 在这种存储
方案中,所有的与数据库相关的类和配置文件都在同一个包目录中;在开发 过程中,配置文件和源文件也按采用这种方式进行组织,这样会使得程序的数据库访问维护 变得相当清晰明了。 大部分开发工具在编译打包这样的源文件组织时,会自动将相关配置文件和类文件放到 生成的目标文件夹中或 JAR 文件中。一般情况下,我们在发布自己的 Java 程序时,都是以 JAR 或 WAR 形式将程序打包发布,而对应的配置文件也会按照上述的目录格式被放到了 JAR 或 WAR 文件中,这样,就实现了配置文件和程序文件打包在一起发布的目的。 现在的
问题是,我们如何读取位于
程序安装文件中的配置文件的信息?比如,在上面的 图中, ConnectionPool 是一个数据库连接池类,它需要在系统启动时自动读取存储在 database.properties 中的数据库连接和配置信息,以便设置相关的数据库连接。这样,我 们 就需要在程序中测定目前程序安装或部署的位置,以便读取对应的属性文件。 在很多其他语言编写的程序中,我们可以利用一些系统提供的 API 或一些全局对象获取 目前应用程序运行所在的目录。比如 VB,我们可以使用 Application 对象测定当前程序的安 装位置,在
Java 程序中如何完成类似的任务呢? Java 程序并没有类似于
VB 那种全局对象,但如果我们观察位于上述目录结构中的 database.properties 文件,应该发现其处于应用程序的 CLASSPATH 中,这样,我们就可以 使用 Java 中的类装载器中的相关的方法, 读出这些配置文件的信息, 该类名为 ClassLoader.
比如,在上例中,我们可以先得到 ConnectinPool 的类装载器,然后测定 ConnectionPool 类所在的包路径,然后利
用 ConnectionPool 所在的包目录读出 database.properties 文件 的信息,对应的伪代码如下: ClassLoader loader=ConnectionPool.class.getClassLoader(); 得到 ConnectionPool 所在的包名; 将包名转换为对应的目录名,存入一个名为 path 的字符串变量中; 调用 loader 的 getResourceAsStream(path+"database.properties"),得到输入流 下面是一个可实际运行的样例代码片段,它可自动测定传入的类所在的包目录,返回传 入的属性文件所代表的输入流。它还有一个附加的功能:如果属性文件直接放到了当前类所 在的根目录 (比如位于 JAR 文件的根目录或 WAR 文件的 WEB-INF/classes 目录中) 系统的用 、 户目录
系统、 系统其他的类路径中时, 它也可以找到; 当然, 如果还是找不到, 它将返回 null. 具体的代码如下: public class PropHelper{ /** *guessPropFile: *@param cls:和要寻找的属性文件处于相同的包中的任意的类 *@param propFile:要寻找的属性文件名 */ public static java.io.InputStream guessPropFile(Class cls,String propFile){ tr