Classloader是从classpath中读取资源的一个类,一般我们用classloader来加载class,实际上,但凡是处在classpath中的文件,我们称之为资源,都可以用classloader来读取。
在java中的API里,有两种方式来使用classpath读取资源。
Java代码
- System.out.println(Bootstrap.class.getResource(""));
- System.out.println(Bootstrap.class.getResource("/"));
- System.out.println(Bootstrap.class.getClassLoader().getResource(""));
- System.out.println(Bootstrap.class.getClassLoader().getResource("/"));
- System.out.println(Bootstrap.class.getResource("name.properties"));
- System.out.println(Bootstrap.class.getResource("/name.properties"));
- System.out.println(Bootstrap.class.getClassLoader().getResource("name.properties"));
class里有一个getResource方法,classloader类里也有getResource方法,这两种API都可以从classpath中读取资源,但是也有一些区别。
class的getResource方法实际上也是用classloader来读取资源,但是起始路径不一样
Java代码
- System.out.println(Bootstrap.class.getResource(""));
这个API的起始路径是当前类的路径,如果要正确的读到资源,目标资源必须和当前class在同一级,或子目录里,可以用相对路径读取到。
Java代码
- System.out.println(Bootstrap.class.getResource("/"));
- System.out.println(Bootstrap.class.getClassLoader().getResource(""));
加上/的读取方式,和调用classloader读取是同一个效果,这个读取代表的是某个classpath下的根路径。
Java代码
- System.out.println(Bootstrap.class.getClassLoader().getResource("/"));
这是一种错误的读取方式,使用classloader的时候,不可以指定/来读取。
例:
Java代码
- System.out.println(Bootstrap.class.getResource("name.properties"));
- System.out.println(Bootstrap.class.getResource("/name.properties"));
- System.out.println(Bootstrap.class.getClassLoader().getResource("name.properties")
第一种读取,代表读取当前类同一级的文件name.properties
第二种和第三种读取等效,都是读取任意classpath根路径下的name.properties文件
Remark
在启动服务的时候,所有的依赖项都是以目录的形式存在在classpath下,这样classloader才能一个一个去加载,而getResource的API里的路径,也都是相对于每一个依赖的目录的路径
具体读写demo如下:
package com.crgt.gtdata.utils;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Properties;
/**
* @Author: wpp
* @Date: 2020/4/17 15:05
*/
public class JavaConfUtil {
/**
*cache缓存
*/
static HashMap<String, Properties> cache = new HashMap<String,Properties>();
/**
* 加载配置文件,默认先读取缓存中配置
* @param filePath
* @return
*/
public static Properties loadProperties2(String filePath ){
if (filePath != null && filePath != ""){
Properties props = new Properties();
InputStream inputStream = JavaConfUtil.class.getResourceAsStream(filePath);
try {
if (inputStream == null) {
return null;
}
props.load(inputStream);
return props;
}catch (Exception e){
e.printStackTrace();
}
}
return null;
}
public static Boolean getIsProd(){
String res = loadProperties2("/config/config.properties").getProperty("isProd");
System.out.println(res);
return false;
}
public static void main(String[] args) {
System.out.println(JavaConfUtil.class.getResource("/config/config.properties"));
System.out.println(getIsProd());
}
}