为什么 getResourceAsStream() 在 IDE 中有效,但在 JAR 中无效?

2024-01-03

我只想将文件读入我的程序。该文件位于工作目录的上一级目录“../f.fsh”。所以当我在IDE中运行以下代码时,它可以正确运行

String name="../f.fsh";
InputStream is = getClass().getResourceAsStream(name);
InputStreamReader isreader=new InputStreamReader(is);//CRASHES HERE WITH NULL POINTER EXCEPTION
BufferedReader br = new BufferedReader(isreader);

但是当我创建一个压缩了 f.fsh 的 JAR 文件并运行它时,它在创建 InputStreamReader 时崩溃,因为 InputStream 为空。

我已经阅读了一堆有关输入流和 JAR 文件的问题的答案,我从中得到的是我应该使用相对路径,但我已经这样做了。据我了解, getResourceAsStream() 可以找到相对于项目根目录的文件,这就是我想要的。为什么它在 JAR 中不起作用?出了什么问题,我该如何解决?

它与类路径有关吗?我认为这只是为了包含正在运行的 jar 外部的文件。

我也尝试过,但在添加斜杠时仍然失败:

InputStream is = getClass().getResourceAsStream("\\"+name);

我在看:如何获取 Java JAR 文件中资源的路径 https://stackoverflow.com/questions/941754/how-to-get-a-path-to-a-resource-in-a-java-jar-file并发现 JAR 的内容不一定可以作为文件来访问。所以我尝试复制相对于 jar 的文件(jar 的上一个目录),但仍然失败。无论如何,我想将我的文件留在 jar 中并能够在那里读取它们。我不知道出了什么问题。


你不能使用.. with Class.getResourceAsStream().

加载资源f.fsh在与类相同的包中,使用SomeClass.class.getResourceAsStream("f.fsh")

加载资源f.fsh在该类包的子包 foo.bar 中,使用SomeClass.class.getResourceAsStream("foo/bar/f.fsh")

加载资源f.fsh在任何包 com.company.foo.bar 中,使用SomeClass.class.getResourceAsStream("/com/company/foo/bar/f.fsh")

javadoc 中对此进行了描述getResource()方法,尽管缺乏示例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 getResourceAsStream() 在 IDE 中有效,但在 JAR 中无效? 的相关文章

随机推荐