Java:无法弄清楚如何使用 class.getClassLoader().getResourceAsStream() 因此它在我构建工件时可以工作

标签 java classloader

我的任务是为我的一个 friend 开发一个不和谐的机器人,并且需要从文件中加载一些字符串。现在,为了在我将项目导出到 jar 时使其工作,有人告诉我使用 class.getClassLoader().getResourceAsStream()

经过 2 个小时的摆弄,阅读文档并再次询问,我让它在 intelliJ 中工作。但当我构建项目时它仍然不起作用。

Project Structure 我的代码:

static final ArrayList<String> QUOTES = new ArrayList<>();

public static void loadArray() {
    try{
        //File fin = new File("src/main/java/com/github/MarvelousAdain/Quotes");
        //FileInputStream fis = new FileInputStream(fin);
        System.out.println("Called loadArray Method");
        BufferedReader br = new BufferedReader(new InputStreamReader(Utilities.class.getClassLoader().getResourceAsStream("Quotes")));

        String line;
        while ((line = br.readLine()) != null) {
            QUOTES.add(line);
        }
        System.out.println("Quotes loaded, no Problem.");
        br.close();
    }catch(IOException e){e.printStackTrace();}
}

如果我尝试在 jar 中运行代码,则会抛出 NullPointerException。

堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
    at java.io.Reader.<init>(Unknown Source)
    at java.io.InputStreamReader.<init>(Unknown Source)
    at com.github.MarvelousAdain.Utilities.loadArray(Utilities.java:31)
    at com.github.MarvelousAdain.Main.main(Main.java:18)

非常感谢您的帮助。

最佳答案

创建 jar 的工具是否包含资源?

您可以检查

jar tf myjar.jar

或者确实是您最喜欢的 zip 工具。

特别的是,getResourceAsStream() 返回 null,而不是像普通 API 那样抛出某种 IOException

另请注意,ClassLoader.getResourceAsStream 将采用相对于类路径的名称,但 Class.getResourceAsStream 将使用指定类的包名称修改路径(即与 .class 文件位于同一“目录”中)。

关于Java:无法弄清楚如何使用 class.getClassLoader().getResourceAsStream() 因此它在我构建工件时可以工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53960345/

相关文章:

java - JVM 如何加载具有自己引用的类

java - OWL API,从 URI 中提取字符串

java - Ant 编译器对特定类文件发出警告

java - 如何为 Eclipse 工作区使用相对路径

java - 将类对象转换为人类可读的字符串

java - ClassLoader问题导致ClassCastException的解决方法

java - 使用 Jpa 和 Thymeleaf 在 Spring Boot 中重定向页面

java - 从应用程序类路径加载配置文件

java - 为什么这个 lambda 函数在错误的类加载器中启动类加载?

java - Weblogic动态类加载