8

我只想将文件读入我的程序。该文件位于“../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);

我查看了:How to get a path to a resource in a Java JAR file并发现 JAR 的内容可能不一定可以作为文件访问。所以我尝试复制相对于 jar 的文件(从 jar 开始的一个目录),但仍然失败。在任何情况下,我都想把我的文件留在罐子里并能够在那里阅读它们。我不知道出了什么问题。

4

3 回答 3

11

你不能使用..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")

这在该getResource()方法的 javadoc 中进行了描述,尽管它缺少示例。

于 2013-04-16T22:07:07.560 回答
4

如果..Class.getResourceAsStream()从 Eclipse 运行时工作,这是 Eclipse 中的一个错误。Eclipse 和其他 IDE 实现自定义类加载器以在运行时从项目中获取资源。看起来 Eclipse 中的类加载器实现没有对getResourceAsStream()方法的输入执行所有必要的验证。在这种情况下,该错误对您有利,但您仍需要重新考虑如何构建资源以使代码在所有情况下都能正常工作。

于 2013-04-16T22:47:09.263 回答
0
  1. 文件名必须区分大小写
  2. 如果文件被移动或复制到 Exclipse 之外,则必须刷新 (F5) 项目资源管理器
于 2021-02-15T17:23:09.857 回答