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

时间:2014-11-26 17:18:08

标签: java core

我谷歌下面的代码如何加载资源     。Abc.class.getClassLoader()的getResourceAsStream("的abc.txt&#34)
并发现它在类路径中搜索所有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文件和目录中的资源,那么为什么我必须指定包路径

3 个答案:

答案 0 :(得分:8)

  

我谷歌下面的代码如何加载资源   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方法。

答案 1 :(得分:1)

我用了这个:

InputStream file = YOURCLASSNAME.class.getClassLoader().getResourceAsStream("app.properties");

如果我正在使用此文件,它不会显示找不到文件,并使用我们的任意路径读取确切的文件,但是您应该放置 app.properties 文件进入项目包文件夹中的main / resources。

答案 2 :(得分:0)

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