getResourceAsStream 返回 null

新手上路,请多包涵

我正在从我的 Java 项目的已编译 JAR 的包中加载一个文本文件。相关目录结构如下:

 /src/initialization/Lifepaths.txt

我的代码通过调用 Class::getResourceAsStream 返回一个 InputStream --- 来加载文件。

 public class Lifepaths {
    public static void execute() {
        System.out.println(Lifepaths.class.getClass().
            getResourceAsStream("/initialization/Lifepaths.txt"));
    }

    private Lifepaths() {}

    //This is temporary; will eventually be called from outside
    public static void main(String[] args) {execute();}
}

无论我使用什么,打印输出将始终打印 null 。我不确定为什么上述方法不起作用,所以我也尝试过:

  • "/src/initialization/Lifepaths.txt"
  • "initialization/Lifepaths.txt"
  • "Lifepaths.txt"

这些都不起作用。到目前为止, 我已经 阅读 了许多 关于 该主题的问题,但没有一个有帮助 - 通常,他们只是说使用根路径加载文件,我已经在这样做了。那,或者只是从当前目录加载文件(只需加载 filename ),我也尝试过。该文件正在以适当的名称编译到适当位置的 JAR 中。

我该如何解决这个问题?

原文由 user1131435 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

Lifepaths.class.getClass().getResourceAsStream(...) 使用系统类加载器加载资源,它显然失败,因为它看不到你的 JAR

Lifepaths.class.getResourceAsStream(...) 使用与加载 Lifepaths 类相同的类加载器加载资源,并且它应该可以访问 JAR 中的资源

原文由 hoaz 发布,翻译遵循 CC BY-SA 3.0 许可协议

规则如下:

  1. 检查您要加载的文件在 JAR 中的位置(从而确保它确实已添加到 JAR 中)
  2. 使用绝对路径:路径从 JAR 的根目录开始
  3. 使用相对路径:路径从您调用的类的包目录开始 getResource/ getResoucreAsStream

并尝试:

 Lifepaths.class.getResourceAsStream("/initialization/Lifepaths.txt")

代替

Lifepaths.class.getClass().getResourceAsStream("/initialization/Lifepaths.txt")

(不确定它是否有所作为,但前者将使用正确的 ClassLoader/JAR,而我不确定后者)

原文由 Puce 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题