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

问题描述 投票:6回答:3

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

java core
3个回答
9
投票

我用Google搜索下面的代码如何加载资源Abc.class.getClassLoader()。getResourceAsStream(“ abc.txt”)并查找它在类中的所有jar文件和zip文件中搜索资源路径。

当您仅使用单个ClassLoader(大多数非OSGi /非模块化环境)时,这是正确的。然后,所有JAR的所有内容都可以看作是一棵大树,其中JAR的类和资源(在类路径中优先出现)战胜了JARS的类和资源,而JARS的类和资源则在后面。

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

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

在以下时间搜索树的根:

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

相对于Abc软件包的搜索。

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

再次搜索树的根。

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

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


1
投票

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


0
投票

我用过这个InputStream file = YOURCLASSNAME.class.getClassLoader()。getResourceAsStream(“ app.properties”);如果我使用此文件,则不会显示文件未找到,并使用我们的任何路径读取确切的文件...但是您应将app.properties文件放入项目包文件夹中的main / resources中。

© www.soinside.com 2019 - 2024. All rights reserved.