本文主要讲解和总结java读取properties/xml等资源文件的几种方法,以备来日使用时翻阅。无论是Servlet、Struts或者Spring、Hibernate,配置资源文件都是必不可少的一项工作,Java中主要提供了提供了2个类来读取资源文件,一个是Class类,一个是ClassLoader类。我们一步步来分析,要获取一个文件的内容,那第一步肯定是要先获取文件的路径,第二步才是读取文件内容。
本文地址:http://blog.csdn.net/chen_zw/article/details/18771897
步骤一:获取资源文件路径
java的Web项目结构相信大家应该都很熟悉,它大概是这样的:
如上图所示,它主要分为了3部分,一个是source folder(src目录下),一个是output folder(build目录下),最后一个是deploy path(WebRoot) ,可能大家的命名不一样,但这3部分对应的功能是一致的。想修改这3部分对应的文件目录,可以选中项目,右键选properties,然后选中Java Build Path进行修改,如下图所示:
首先说下source folder目录,这个目录下存放的是项目java源码,也就是可阅读、可编写的代码。而output folder目录则存放着java源码编译后生成的字节码,是.class文格式的,最后是deploy path目录,这是javaWeb项目独有的,主要存放的是Web相关的jar包、配置文件和网页资源等。我们可能将要读取的资源文件放在在source folder(src )或者deploy path(WebRoot )目录下,而两者的读取方式也是不同的。
我们先来看看放在source folder(src )目录下的资源文件如何读取的吧,假设资源文件放置在这里:
public class PropertiesUtil {
/**
* @Description: 我们使用Class.getResourceAsStream(String path)方法来获取资源文件
* @author: chenzw
* @CreateTime: 2014-1-25 下午7:02:40
* @param args
* @throws
*/
public static void main(String[] args) {
/* path中不以'/'开头表示该路径是相对路径,相对于当前类所在的目录 */
InputStream is = PropertiesUtil.class.getResourceAsStream("cfg/jdbc.properties");
// 等同于 InputStream is = this.getClass().getResourceAsStream("cfg/jdbc.properties"); --this.getClass()不能在static方法中使用
/* path中以'/'开头表示该路径是绝对路径,相对于classpath的绝对路径 */
InputStream is2 = PropertiesUtil.class.getResourceAsStream("/com/util/cfg/jdbc.properties");
// 等同于 InputStream is2 = this.getClass().getResourceAsStream("/com/util/cfg/jdbc.properties"); --this.getClass()不能在static方法中使用
// 等同于 InputStream is2 = Thread.currentThread().getClass().getResourceAsStream("/com/util/cfg/jdbc.properties");
/* 使用getClassLoader()表示该路径是相对于classpath目录的相对路径*/
InputStream is3 = PropertiesUtil.class.getClassLoader().getResourceAsStream("com/util/cfg/jdbc.properties");
// 等同于 InputStream is3 = this.getClass().getClassLoader().getResourceAsStream("com/util/cfg/jdbc.properties"); --this.getClass()不能在static方法中使用
// 等同于 InputStream is3 = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/util/cfg/jdbc.properties");
//这3种方式获取的资源文件是同一个。
}
}
再来看看放在WebRoot目录下的资源文件是怎么读取的,假设资源文件存放在这里:
步骤二:读取资源文件
package com.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class PropertiesUtil {
/**
* @throws IOException
* @Description: 我们使用Class.getResourceAsStream(String path)方法来获取资源文件
* @author: chenzw
* @CreateTime: 2014-1-25 下午7:02:40
* @param args
* @throws
*/
public static void main(String[] args) throws IOException {
//资源文件路径的多种获取方法详见步骤一
InputStream is = PropertiesUtil.class.getResourceAsStream("cfg/jdbc.properties");
Properties ps = new Properties();
//加载properties资源文件
ps.load(is);
System.out.println(ps.getProperty("jdbc.url"));
System.out.println(ps.getProperty("jdbc.user"));
System.out.println(ps.getProperty("jdbc.pass"));
}
}