加载资源的方式
1)通过类加载器对象去加载资源
2)通过类的字节码对象去加载资源
- ClassLoader.getResource()
- 以反斜杠/开头时:会将参数路径视为绝对路径来读取,导致该绝对路径不以classPath为前缀,会直接返回null。因此,采用这种方式时,不能以反斜杠/开头。
- 不以反斜杠/开头时:将参数路径当作相对路径来读取,该相对路径会拼接上ClassPath根路径(…/target/classes/)得到最终的绝对路径。此种方式是从ClassPath根下获取
- Class.getResource()
- 以反斜杠/开头时:将参数路径当作相对路径来读取,解析参数路径时会去掉/,然后当作相对路径来读取,该相对路径会拼接上ClassPath根路径(…/target/classes/)得到最终的绝对路径。此种方式与ClassLoader.getResource方法相同。
- 不以反斜杠/开头时:该相对路径会拼接上当前类所在包的路径,再拼接上classPath路径,得到最终的绝对路径。此种方式,检索的是当前类所在包下的文件路径
例子
package testpackage;
public class TestMain {
public static void main(String[] args) {
//输出 **/target/classes/testpackage
System.out.println(TestMain.class.getResource("").getPath());
//输出 **/target/classes/
System.out.println(TestMain.class.getResource("/").getPath();
}
}
总结
使用类加载器对象加载资源时,路径不需要加‘/’,并且这是加载resources文件夹下的资源;
使用类的字节码对象加载资源时,路径加‘/’,加载resources文件夹下的资源。路径不加‘/’,加载当前类所在包的资源。