java如何加载资源?
Java 从环境中读取资源,在多数情况下,java直接在Classpath下检索jar. 因为加载资源和代码运行位置无关,java中的资源加载被称为location independent,java仅需要正确的环境即可找到资源.
绝对路径和相对路径
资源的引用都是使用资源名: getResourceAsStream("/path/resource.xml");
其中"/path/resource.xml"
就是资源名;
资源名可以:
- 绝对路径,例如"/path/resource.xml"; 以''/''开头即为绝对路径
- 相对路径,例如"path/resource.xml";
相对路径是指,相对于方法被调用的位置,路径会拼接,而绝对路径则会将/移除后直接使用
package my.location;
class ResourceFinder {
...
public void findResources(){
InputStream stream1 =
getClass().getResourceAsStream("/path/resource.xml");
InputStream stream2 =
getClass().getResourceAsStream("path/resource.xml");
}
...
}
- stream1获取资源的路径为
path/resource.xml
- stream2获取资源路径为
my/location/path/resource.xml
ClassLoader 和Class对文件名的不同处理
ClassLoader.getResource()
Class.getResource()
工作方式不同
ClassLoader 直接使用给定string作为资源名而不使用绝对路径/相对路径的转换,因此string不能以/开头
package my.location;
class ResourceFinder {
...
public void findResources(){
InputStream stream1 =
getClass().getResourceAsStream("/path/resource.xml");
InputStream stream2 =
getClass().getResourceAsStream("path/resource.xml");
InputStream stream3 =
getClass().getClassLoader().getResourceAsStream("path/resource.xml");
InputStream stream4 =
getClass().getClassLoader().getResourceAsStream("/path/resource.xml");
}
...
}
stream3的文件路径为 path/resource.xml
,而stream4的路径是非法的
参考文献: