一旦构建了我的 JAR,我将尝试读取 resource
文件夹的内容。资源文件夹在 IDE 设置 (IntelliJ) 中标记为 source
。
我试过以下方法:
InputStream input = getClass().getResourceAsStream("../objectLocation.json");
JsonReader jsonReader = new JsonReader(new InputStreamReader(input));
我也试过:
JsonReader jsonReader = new JsonReader(new FileReader("../resources/objectLocation.json"));
这两种方法都会导致:
结果是:
java.io.FileNotFoundException: com/layers/resources/objectLocation.json (No such file or directory)
文件结构:
src
-com.layers -> myClasses
-resources -> JSON
编辑:
InputStream input = getClass().getResourceAsStream("objectLocation.json");
JsonReader jsonReader = new JsonReader(new InputStreamReader(input));
结果:
java.lang.NullPointerException
最佳答案
在 Java 中通过 getResourceAsStream()
加载资源时,不理解绝对 和相对 路径之间的区别是导致错误的常见来源NullPointerException
。
假设结构和内容如下:
My Project
|-src
|-main
|-java
| |-SomePackage
| |-SomeClass.java
|-resources
|-Root.txt
|-SomePackage
|-MyData.txt
|-SomePackage2
|-MySubData.txt
内容将在 .jar 中重新组织如下:
|-Root.txt
|-SomePackage
|-SomeClass.java
|-MyData.txt
|-SomePackage2
|-MySubData.txt
以下指示检索资源数据的有效方法和无效方法:
InputStream IS;
IS = SomeClass.class.getResourceAsStream("Root.txt"); // Not OK
IS = SomeClass.class.getResourceAsStream("/Root.txt"); // OK
IS = SomeClass.class.getResourceAsStream("/MyData.txt"); // Not OK
IS = SomeClass.class.getResourceAsStream("MyData.txt"); // OK
IS = SomeClass.class.getResourceAsStream("/SomePackage/MyData.txt"); // OK
IS = SomeClass.class.getResourceAsStream("SomePackage/MyData.txt"); // Not OK
IS = SomeClass.class.getResourceAsStream("MySubData.txt"); // Not OK
IS = SomeClass.class.getResourceAsStream("SomePackage/SomePackage2/MySubData.txt"); // OK
IS = SomeClass.class.getResourceAsStream("/SomePackage/SomePackage2/MySubData.txt"); // Not OK
IS = SomeClass.class.getResourceAsStream("/SomePackage2/MySubData.txt"); // Not OK
IS = SomeClass.class.getResourceAsStream("SomePackage2/MySubData.txt"); // OK
getResourceAsStream()
相对于调用的类实例对应的包进行操作。
关于java - 访问jar中的资源文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32094701/