在jar包中访问资源文件夹

3

在我的JAR构建完成后,我试图读取“资源”文件夹的内容。在IDE设置(IntelliJ)中,资源文件夹被标记为“源”。

我尝试了以下方法:

  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

1
我认为你不需要 "..",因为这样会超出你的源位置。尝试使用 InputStream input = getClass().getResourceAsStream("objectLocation.json");,如果它位于资源文件夹的子文件夹中,则使用 InputStream input = getClass().getResourceAsStream("<subfolder>/objectLocation.json"); - MrT
这导致了一个 java.lang.NullPointerException - Colin747
抱歉,我错过了“/” -> try .getResourceAsStream("/objectLocation.json"); - MrT
2
尝试使用InputStream input = getClass().getResourceAsStream("./objectLocation.json"); - Trisha
那似乎解决了这个问题。 - Colin747
1个回答

10

当使用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() 方法是相对于调用该方法的 Class 实例所对应的包进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接