getClassLoader()。getResourceAsStream()如何在java中工作

我谷歌如何下面的代码加载资源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文件和目录中的资源,那么为什么我必须指定包路径

我谷歌如何下面的代码加载资源Abc.class.getClassLoader()。getResourceAsStream(“abc.txt”),并发现它搜索类路径中所有jar文件和zip文件中的资源。

当你只使用一个ClassLoader(大多数非OSGi /非模块化环境)时,这是正确的。 然后,所有JAR的所有内容都可以看作是一个大树,其中JAR的类和资源(在类路径之前出现)胜过JARS的那些,后者发生在后面。

但是,当我尝试它时,我无法加载它,但如果我给包路径然后我能够加载它可以有人告诉我如何getResourceAsStream搜索类路径

 Abc.class.getClassLoader().getResourceAsStream("abc.txt") 

在树的根处搜索,同时:

 Abc.class.getResourceAsStream("abc.txt") 

搜索相对于Abc的包。

 Abc.class.getResourceAsStream("/abc.txt") 

再次搜索树的根。

所有这些方法只搜索指定的目录(或根目录),不会遍历和搜索整个树。

就个人而言,我通常总是使用后两个版本( Class.getResourceAsStream ),很少直接使用ClassLoader.getResourceAsStream方法。

例如,您可以创建一个“资源” 源文件夹 ,将文件放入其中,然后使用Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.txt");
我总是使用这种方法。