访问 jar 中的资源文件夹

Col*_*747 2 java resources json intellij-idea gson

resource构建 JAR 后,我正在尝试读取文件夹的内容。资源文件夹source在 IDE 设置 (IntelliJ) 中标记为 a 。

我尝试了以下方法:

  InputStream input = getClass().getResourceAsStream("../objectLocation.json");
  JsonReader jsonReader = new JsonReader(new InputStreamReader(input));
Run Code Online (Sandbox Code Playgroud)

我也试过:

  JsonReader jsonReader = new JsonReader(new FileReader("../resources/objectLocation.json"));
Run Code Online (Sandbox Code Playgroud)

这两种方法都会导致:

结果是:

java.io.FileNotFoundException: com/layers/resources/objectLocation.json (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

文件结构:

src

-com.layers -> myClasses

-resources -> JSON
Run Code Online (Sandbox Code Playgroud)

编辑:

  InputStream input = getClass().getResourceAsStream("objectLocation.json");
  JsonReader jsonReader = new JsonReader(new InputStreamReader(input));
Run Code Online (Sandbox Code Playgroud)

结果在:

java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)

Kei*_*ith 7

在通过 Java 加载资源时不了解绝对路径和相对路径之间的区别getResourceAsStream()是导致NullPointerException.

假设结构和内容如下:

My Project
  |-src
    |-main
      |-java
      | |-SomePackage
      |   |-SomeClass.java
      |-resources
        |-Root.txt
        |-SomePackage
          |-MyData.txt
          |-SomePackage2
            |-MySubData.txt
Run Code Online (Sandbox Code Playgroud)

.jar 中的内容将按以下方式重新组织:

|-Root.txt
  |-SomePackage
    |-SomeClass.java
    |-MyData.txt
    |-SomePackage2
      |-MySubData.txt
Run Code Online (Sandbox Code Playgroud)

以下指示检索资源数据的方法和无效方法:

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
Run Code Online (Sandbox Code Playgroud)

getResourceAsStream() 相对于被调用类实例对应的包进行操作。