为什么getResourceAsStream()在IDE中工作但在JAR中不起作用?

时间:2013-04-16 21:51:45

标签: java eclipse file-io jar inputstream

我只想在我的程序中读取一个文件。该文件位于工作目录上方的一个目录“../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为null。

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

是否与classpath有关?我认为这只是为了包含正在运行的jar外部的文件。

我还试过,但仍然失败,在斜杠:

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

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

3 个答案:

答案 0 :(得分:9)

您无法将..Class.getResourceAsStream()一起使用。

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

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

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

这在getResource()方法的javadoc中有描述,尽管它没有示例。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

  1. 文件名必须区分大小写
  2. 如果文件被移动或复制到 Exclipse 之外,则必须刷新 (F5) 项目资源管理器