在jar中访问资源文件夹 [英] Access resource folder within jar

查看:125
本文介绍了在jar中访问资源文件夹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在构建JAR之后阅读资源文件夹的内容。资源文件夹在IDE设置(IntelliJ)中标记为 source



我尝试了以下方法:

  InputStream input = getClass()。getResourceAsStream(../ objectLocation.json); 
JsonReader jsonReader = new JsonReader(new InputStreamReader(input));

我也试过:

<$ p $ jsonReader jsonReader = new JsonReader(new FileReader(../ resources / objectLocation.json));

这两种方法都会导致:

导致:

$ p $ java.io.FileNotFoundException:com / layers / resources / objectLocation.json(没有这样的文件或目录)

文件结构:

  src 

-com.layers - > myClasses

-resources - > JSON

编辑:

  InputStream input = getClass()。getResourceAsStream(objectLocation.json); 
JsonReader jsonReader = new JsonReader(new InputStreamReader(input));

结果为:

  java.lang.NullPointerException 


解决方案

通过 getResourceAsStream()加载Java中的资源时,不理解绝对相对路径错误导致 NullPointerException



假设以下结构和内容:

 我的项目
| -src
| --main
| -java
| | - 一些包
| | -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); //不行

IS = SomeClass.class.getResourceAsStream(/ Root.txt); // OK

IS = SomeClass.class.getResourceAsStream(/ MyData.txt); //不好

IS = SomeClass.class.getResourceAsStream(MyData.txt); // OK

IS = SomeClass.class.getResourceAsStream(/ SomePackage / MyData.txt); // OK

IS = SomeClass.class.getResourceAsStream(SomePackage / MyData.txt); //不好

IS = SomeClass.class.getResourceAsStream(MySubData.txt); //不正确

IS = SomeClass.class.getResourceAsStream(SomePackage / SomePackage2 / MySubData.txt); // OK

IS = SomeClass.class.getResourceAsStream(/ SomePackage / SomePackage2 / MySubData.txt); //不行

IS = SomeClass.class.getResourceAsStream(/ SomePackage2 / MySubData.txt); //不好

IS = SomeClass.class.getResourceAsStream(SomePackage2 / MySubData.txt); // OK

getResourceAsStream()到与被调用的Class实例对应的包。

I am trying to read the contents of a resource folder once my JAR is built. The resource folder is marked as a source in the IDE settings (IntelliJ).

I have tried the following methods:

  InputStream input = getClass().getResourceAsStream("../objectLocation.json");
  JsonReader jsonReader = new JsonReader(new InputStreamReader(input));

I have also tried:

  JsonReader jsonReader = new JsonReader(new FileReader("../resources/objectLocation.json"));

Both of these methods results in :

Which results in:

java.io.FileNotFoundException: com/layers/resources/objectLocation.json (No such file or directory)

File structure:

src

-com.layers -> myClasses

-resources -> JSON

EDIT:

  InputStream input = getClass().getResourceAsStream("objectLocation.json");
  JsonReader jsonReader = new JsonReader(new InputStreamReader(input));

Results in a:

java.lang.NullPointerException

解决方案

Not understanding the difference between absolute and relative paths when loading resources in Java via getResourceAsStream() is a common source of errors leading to NullPointerException.

Assuming the following structure and content:

My Project
  |-src
    |-main
      |-java
      | |-SomePackage
      |   |-SomeClass.java
      |-resources
        |-Root.txt
        |-SomePackage
          |-MyData.txt
          |-SomePackage2
            |-MySubData.txt

Content will be re-organized as following in the .jar:

|-Root.txt
  |-SomePackage
    |-SomeClass.java
    |-MyData.txt
    |-SomePackage2
      |-MySubData.txt

The following indicates what works and what does not work to retrieve resource data:

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() operates relative to the package corresponding to the called Class instance.

这篇关于在jar中访问资源文件夹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆