java的世界离不开资源配置文件,像spring框架等都非常依赖资源配置文件,而且spring也封装了resource类,来处理资源文件的加载,这里就不仔细分析spring加载资源文件了,主要分析下java 的ResourceBundle类加载资源配置文件。
其实分析了一下这个类的实现,其原理和spring一样,都是利用ClassLoader读取系统资源(SystemResource)文件。
ResourceBundle bundle = ResourceBundle.getBundle(propFile, Locale.ENGLISH);
这个是统一的资源加载方式,属性文件的加载由
System.out.println(bundle.getClass());// class java.util.PropertyResourceBundle
java.util.PropertyResourceBundle这个实现类实现的,这个实现类主要读取资源(从指定文件),加载文件到
java.util.Properties。
读取加载文件内容的关键代码:
@SuppressWarnings({"unchecked", "rawtypes"})
public PropertyResourceBundle (InputStream stream) throws IOException {
Properties properties = new Properties();
properties.load(stream);
lookup = new HashMap(properties);
}
@SuppressWarnings({"unchecked", "rawtypes"})
public PropertyResourceBundle (Reader reader) throws IOException {
Properties properties = new Properties();
properties.load(reader);
lookup = new HashMap(properties);
}
不过定位资源文件的操作还是要看抽象类ResourceBundle的代码:
/**
* A wrapper of ClassLoader.getSystemClassLoader().
*/
private static class RBClassLoader extends ClassLoader {
private static final RBClassLoader INSTANCE = AccessController.doPrivileged(
new PrivilegedAction<RBClassLoader>() {
public RBClassLoader run() {
return new RBClassLoader();
}
});
private static final ClassLoader loader = ClassLoader.getSystemClassLoader();
private RBClassLoader() {
}
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (loader != null) {
return loader.loadClass(name);
}
return Class.forName(name);
}
public URL getResource(String name) {
if (loader != null) {
return loader.getResource(name);
}
return ClassLoader.getSystemResource(name);
}
public InputStream getResourceAsStream(String name) {
if (loader != null) {
return loader.getResourceAsStream(name);
}
return ClassLoader.getSystemResourceAsStream(name);
}
}
定位资源文件加载资源的关键是
getResource
<pre name="code" class="java">getResourceAsStream
这些方法。