在Java中经常会需要读取各种各样的配置文件,在获取资源时,一般会用到 Class.getResource() 或 ClassLoader.getResource() ; 那么这两种方式在获取资源文件时有什么相同或者不同的地方呢?
在Java中经常会需要读取各种各样的配置文件,在获取资源时,一般会用到 Class.getResource() 或 ClassLoader.getResource() ;
那么这两种方式在获取资源文件时有什么相同或者不同的地方呢?
先贴上代码目录结构:
1 | ┌─src |
Class.getResource()
测试代码,先看 this.getClass().getResource():
代码的输出结果我直接贴在代码的上一行了,下同。
1 | @Test |
可以看出,getResource("") 获取的是当前类所在包的路径,而 getResource("/") 获取的是 classpath 根路径;
继续测试,我们获取目录下的文件:
1 | @Test |
输出结果显示:
- 当以
"/"开头时,是从classpath路径开始匹配资源; - 当不以
"/"开头时,是从当前类所在包的路径开始匹配资源; - 两种方式都可以通过
"/"或"../"在文件夹上下层路径切换;
另外,在获取文件时,我们还可以通过 getResourceAsStream 直接获取文件输入流,如:
1 | InputStream inputStream = this.getClass().getResourceAsStream("/config.properties"); |
且 getResourceAsStream() 和 getResource() 在获取文件流和文件路径时,路径选择机制是一样的。
ClassLoader.getResource()
接着看 this.getClass().getClassLoader().getResource ,上代码:
1 | @Test |
在使用 ClassLoader().getResource 获取路径时,不能以 "/" 开头,且路径总是从 classpath 根路径开始;
1 | @Test |
这里跟上面差别不大,所以直接把结果写在代码注释中了, ClassLoader().getResource 只能从 classpath 开始获取资源,同样也能使用getResourceAsStream() 获取文件输入流,且路径机制一样;
总结
Class.getResource()可以从当前Class所在包的路径开始匹配获取资源,也可以从classpath根路径开始匹配获取资源;ClassLoader().getResource()只能从classpath根路径开始匹配获取资源;Class.getResource()从当前包所在路径获取资源时不能以"/"开头,而从classpath根路径获取资源时必须以"/"开头;ClassLoader().getResource()不能以"/"开头,且路径总是从classpath根路径开始;- 它们都能通过
getResourceAsStream()方法获取对应路径文件的输入流,文件路径匹配机制和其getResource()方法一样;

