AAB*_*AAB 7 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);
Run Code Online (Sandbox Code Playgroud)
但是当我创建一个在其中压缩了f.fsh并运行它的JAR文件时,它会在创建InputStreamReader时崩溃,因为InputStream为null.
我已经阅读了一些关于输入流和JAR文件的问题的答案,我从中得到的是我应该使用相对路径,但我已经这样做了.根据我的理解,getResourceAsStream()可以找到相对于项目根目录的文件,这就是我想要的.为什么它在JAR中不起作用?出了什么问题,我该如何解决?
它与classpath有关吗?我认为这只是为了包含正在运行的jar外部的文件.
在尝试使用斜杠时,我也尝试了但仍然失败了:
InputStream is = getClass().getResourceAsStream("\\"+name);
Run Code Online (Sandbox Code Playgroud)
我看了一下:如何获取Java JAR文件中的资源路径,并发现JAR的内容可能不一定可以作为文件访问.所以我尝试将文件相对于jar(jar中的一个目录)复制,但仍然失败.在任何情况下,我都希望将我的文件留在jar中,并能够在那里阅读它们.我不知道出了什么问题.
JB *_*zet 10
您不能使用..与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中对此进行了描述.
如果..在从 Eclipse 运行时工作正常Class.getResourceAsStream(),则这是 Eclipse 中的一个错误。Eclipse 和其他 IDE 实现自定义类加载器以在运行时从项目中获取资源。看起来 Eclipse 中的类加载器实现没有对getResourceAsStream()方法的输入执行所有必要的验证。在这种情况下,错误对您有利,但您仍然需要重新考虑如何构建资源以使代码在所有情况下都能工作。