【问题标题】:Access resource folder within jar访问jar中的资源文件夹
【发布时间】:2015-08-19 20:59:44
【问题描述】:

我正在尝试在构建 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

【问题讨论】:

  • 我认为您不需要“..”,因为您超出了源位置。尝试InputStream input = getClass().getResourceAsStream("objectLocation.json");,如果它位于资源文件夹的子文件夹中而不是InputStream input = getClass().getResourceAsStream("<subfolder>/objectLocation.json");
  • 这导致java.lang.NullPointerException
  • 对不起,我错过了“/” -> try .getResourceAsStream("/objectLocation.json");
  • 试试 InputStream input = getClass().getResourceAsStream("./objectLocation.json");
  • 这似乎已经解决了问题。

标签: java json intellij-idea resources gson


【解决方案1】:

在通过getResourceAsStream() 在 Java 中加载资源时,不理解 absoluterelative 路径之间的区别是导致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()相对于被调用类实例对应的包进行操作。

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多