1. java加载资源的方式
1.1 通过java i/o提供的接口以普通文件的形式加载
1.2 通过Class 类加载资源
public InputStream getResourceAsStream(String name);
如果使用Class类来加载资源文件需要区分以 '/' 开头和不以 '/'开头。
- 以 '/'开头:Java以classpath为根目录,直接加上name来搜索资源文件。
- 不以 '/'开头:资源文件的全路径应该为:调用getResourceAsStream方法的类的package路径加上name。
/**
* Add a package name prefix if the name is not absolute Remove leading "/"
* if name is absolute
*/
private String resolveName(String name) {
if (name == null) {
return name;
}
//不以 ‘/’开头处理路径,移除/,包名中.换成/
/**
* 比如:com.velocity --> com/velocity
**/
if (!name.startsWith("/")) {
Class<?> c = this;
while (c.isArray()) {
c = c.getComponentType();
}
String baseName = c.getName();
int index = baseName.lastIndexOf('.');
if (index != -1) {
name = baseName.substring(0, index).replace('.', '/')
+"/"+name;
}
} else {
//以 / 开头紧紧简单移除 /
name = name.substring(1);
}
return name;
}
1.3 通过ClassLoader 加载资源
public InputStream getResourceAsStream(String name);
用ClassLoader加载配置文件时,name均不能以"/"开头,在查找时直接在classpath下进行查找。
1.4 java加载资源的demo
1.4.1 项目结构
1.4.2 conf.properties
pro=pro
1.4.2 main函数
package com.velocity.resources;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @author mingxin
*/
public class ResourcesLoad {
public static void main(String[] args){
ResourcesLoad main = new ResourcesLoad();
try{
main.loadByClassLoader();
}catch (IOException e){
e.printStackTrace();
}
}
public void loadByClass() throws IOException{
InputStream input = this.getClass().getResourceAsStream("/conf.properties");
Properties properties = new Properties();
properties.load(input);
System.out.println(properties);
}
public void loadByClassLoader() throws IOException{
InputStream input = this.getClass().getClassLoader().getResourceAsStream("conf.properties");
Properties properties = new Properties();
properties.load(input);
System.out.println(properties);
}
}
2. velocity加载配置文件的方式
2.1 Velocity.init( String propsFilename )
找到 Velocity.init源码
/**
* initialize the Velocity runtime engine, using default properties
* plus the properties in the properties file passed in as the arg
*
* @param propsFilename file containing properties to use to initialize
* the Velocity runtime
*/
public static void init( String propsFilename )
{
RuntimeSingleton.init(propsFilename);
}
一路找下去最终可以到ExtendedProperties,可以看到文件的加载是使用new File()来的,这样我们必须给的是绝对路径,所以init一般使用不带参数版本或者Properties作为参数的。
/**
* Creates and loads the extended properties from the specified file.
*
* @param file the filename to load
* @param defaultFile a second filename to load default values from
* @throws IOException if a file error occurs
*/
public ExtendedProperties(String file, String defaultFile) throws IOException {
this.file = file;
basePath = new File(file).getAbsolutePath();
basePath = basePath.substring(0, basePath.lastIndexOf(fileSeparator) + 1);
FileInputStream in = null;
try {
in = new FileInputStream(file);
this.load(in);
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {}
}
if (defaultFile != null) {
defaults = new ExtendedProperties(defaultFile);
}
}