【问题标题】:How getClassLoader().getResourceAsStream() works in javagetClassLoader().getResourceAsStream() 在 java 中的工作原理
【发布时间】:2014-11-26 17:18:08
【问题描述】:

我用谷歌搜索下面的代码如何加载资源 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


    【解决方案1】:

    我用谷歌搜索下面的代码如何加载资源 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. “搜索树的根”是什么意思,即类路径中的所有 jar。如果不是我如何搜索所有 jar 文件。
    • 以及(大多数非OSGi/非模块化环境)是什么意思
    • 1.它将在所有提供指定目录的 jar 中搜索。如果你在根目录中查找文件,那么它将在所有 JAR 的根目录(但仅根目录)中搜索。
    • OSGi 或 NetBeans 模块系统等模块系统为每个包/模块(即 JAR)提供一个类加载器。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我用过这个:

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

      如果我使用它,它不会显示 file not found 并使用我们的任何路径读取确切的文件,但你应该把你的 app.properties 文件进入项目包文件夹中的main/resources。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-10
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 2010-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多