我谷歌下面的代码如何加载资源
Abc.class.getClassLoader()。getResourceAsStream(“abc.txt”)
并发现它在类路径中的所有jar文件和zip文件中搜索资源。
但是当我尝试它时,我无法加载它,但是如果我给出了包路径,那么我就能够加载它
有人可以告诉我getResourceAsStream如何搜索类路径
谢谢
一种情况是:
我下面的代码是一个简单的程序,我的资源文件abc.txt在com.abc包中。当我指定包的路径时,它起作用了,而当我没有时,它不起作用了。
package com.abc;
public class ResourceExp {
public static void main(String args[])
{
new ResourceExp().getResource();
}
public void getResource()
{
String name = "abc.txt";
// worked
System.out.println(ResourceExp.class.getClassLoader().getResourceAsStream("com/abc/"+name));
//not workded
//System.out.println(ResourceExp.class.getClassLoader().getResourceAsStream(name));
}
}
如果getResourceAsStream在所有jar文件和目录中查找资源,那么为什么我必须指定包路径
最佳答案
当您仅使用单个ClassLoader(大多数非OSGi/非模块化环境)时,这是正确的。然后,所有JAR的所有内容都可以看作是一棵大树,其中JAR的类和资源(在类路径中优先出现)战胜了JARS的类和资源,后者在更后的位置出现。
Abc.class.getClassLoader().getResourceAsStream("abc.txt")
在以下位置搜索树的根部:
Abc.class.getResourceAsStream("abc.txt")
相对于Abc软件包进行搜索。
Abc.class.getResourceAsStream("/abc.txt")
再次在树的根部搜索。
所有这些方法将仅在指定目录(或根目录)中搜索,而不会遍历和搜索整个树。
就个人而言,我通常总是使用后两个版本(
Class.getResourceAsStream
),很少直接使用ClassLoader.getResourceAsStream
方法。