【问题标题】:Access resource from inside jar从 jar 内部访问资源
【发布时间】:2015-09-06 21:37:07
【问题描述】:

我有一个 jar 文件 test.jar,其中包含一个文件夹资源,其中包含 txtFile.txt。

我正在尝试访问该文件,但该文件似乎为空。

package main;

import java.net.URL;

public class Test {

    private Test() {
        URL file = this.getClass().getClassLoader().getResource("/resources/txtFile.txt");
        System.out.println(file == null);
    }

    public static final void main(String[] args) {
        new Test();
    }
}

【问题讨论】:

标签: java jar classloader


【解决方案1】:

尝试使用getResource("resources/txtFile.txt");(即不使用第一个/)。

在使用ClassLoadergetResource 版本时,不应有前导斜杠,它将始终被解释为绝对路径。

【讨论】:

  • 这是因为当您使用Class.getResource 时,您使用'/' 表示路径是绝对的,而不是相对于类。它在委托给类加载器之前去除前导的“/”。
  • @roby 我明白了,谢谢你的信息。有趣的是,我最初链接到的非常赞成的答案弄错了这部分。我已经从我的答案中删除了这部分,只是提供了它的本质。
【解决方案2】:

如果你使用 maven,src/main/resourcessrc/test/resources 是 txtFile.txt 在两者中的任何一个中,你不需要在路径中使用resources/。你可以改用这个

this.getClass().getClassLoader().getResource("/txtFile.txt");

【讨论】:

    【解决方案3】:

    您可以使用以下命令请求 InputStream,而不是使用流作为文件:

    InputStream in = getClass().getResourceAsStream("/txtFile.txt"); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    

    【讨论】:

      【解决方案4】:

      您不必指定资源文件夹。您可以直接使用文件名作为

      getClass().getResourceAsStream("txtFile.txt"); 
      

      【讨论】:

      • 嗯。可以尝试将其放入包中并使用 pckage 名称调用
      【解决方案5】:

      所以我这样做了

      package main;
      
      import java.io.IOException;
      import java.io.InputStream;
      import java.net.URL;
      
      public class Test {
      
          private Test() {
              Class<?> c = this.getClass();
              ClassLoader cl = c.getClassLoader();
              InputStream[] iss = new InputStream[8];
              URL[] urls = new URL[8];
              iss[0] = c.getResourceAsStream("/resources/txtFile.txt");
              iss[1] = c.getResourceAsStream("resources/txtFile.txt");
              iss[2] = c.getResourceAsStream("/txtFile.txt");
              iss[3] = c.getResourceAsStream("txtFile.txt");
              iss[4] = cl.getResourceAsStream("/resources/txtFile.txt");
              iss[5] = cl.getResourceAsStream("resources/txtFile.txt");
              iss[6] = cl.getResourceAsStream("/txtFile.txt");
              iss[7] = cl.getResourceAsStream("txtFile.txt");
              urls[0] = c.getResource("/resources/txtFile.txt");
              urls[1] = c.getResource("resources/txtFile.txt");
              urls[2] = c.getResource("/txtFile.txt");
              urls[3] = c.getResource("txtFile.txt");
              urls[4] = cl.getResource("/resources/txtFile.txt");
              urls[5] = cl.getResource("resources/txtFile.txt");
              urls[6] = cl.getResource("/txtFile.txt");
              urls[7] = cl.getResource("txtFile.txt");
              for (int i = 0; i < 8; i++)
                  System.out.println("iss[" + i + "] is "
                          + String.valueOf(iss[i] == null));
              for (int i = 0; i < 8; i++)
                  System.out.println("url[" + i + "] is "
                          + String.valueOf(urls[i] == null));
              int read;
              try {
                  while ((read = iss[0].read()) != -1)
                      System.out.print((char) read);
              } catch (IOException e) {
              }
      
          }
      
          public static final void main(String[] args) {
              new Test();
          }
      }
      

      输出:

      iss[0] is false
      iss[1] is true
      iss[2] is true
      iss[3] is true
      iss[4] is true
      iss[5] is false
      iss[6] is true
      iss[7] is true
      url[0] is false
      url[1] is true
      url[2] is true
      url[3] is true
      url[4] is true
      url[5] is false
      url[6] is true
      url[7] is true
      This is sample text.
      

      结论:当我使用getClass().getResource("/resources/txtFile.txt")getClass().getClassLoader().getResource("resources/txtFile.txt") 时它有效(getResourceAsStream() 也有效)。

      【讨论】:

        猜你喜欢
        • 2012-04-27
        • 1970-01-01
        • 2016-12-29
        • 2012-05-11
        • 2016-05-13
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多