java中取资源时,经常用到Class.getResource
和ClassLoader.getResource
,这里来看看他们在取资源文件时候的路径问题。
Class.getResource(String path)
path 不以 ‘/’ 开头时,默认是从此类所在的包下取资源;
path 以 ‘/’ 开头时,则是从ClassPath根下获取;
什么意思呢?看下面这段代码的输出结果就明白了:
package packone;
public class TestMain {
public static void main(String[] args) {
// file:/E:/git/practice/getResource/target/classes/packone/
System.out.println(TestMain.class.getResource(""));
// file:/E:/git/practice/getResource/target/classes/
System.out.println(TestMain.class.getResource("/"));
// file:/E:/git/practice/getResource/target/classes/test.properties
System.out.println(TestMain.class.getResource("/test.properties"));
// file:/E:/git/practice/getResource/target/classes/
System.out.println(TestMain.class.getClassLoader().getResource(""));
// file:/E:/git/practice/getResource/target/classes/test.properties
System.out.println(TestMain.class.getClassLoader().getResource("test.properties"));
}
}
※ Class.getResource和Class.getResourceAsStream在使用时,路径选择上是一样的。
Class.getClassLoader().getResource(String path)
path>不能以’/'开头;
path是从ClassPath根下获取;
在很多情况下,Class.getResource
和ClassLoader.getResource
可以随意选择,效果一样。但是当项目打成jar包后,调用前者,且path以’/'开头,则会出现找不到资源的问题,这时候就应该选择后者
※Class.getClassLoader().getResource
和Class.getClassLoader().getResourceAsStream
在使用时,路径选择上也是一样的。