如何从JAR中读取文件作为文件

时间:2016-04-01 07:31:52

标签: java file classloader iostream

我已经创建了可执行jar文件,该文件位于资源文件夹

    Example.jar
    |
    |__src
    |  |
    |  Main.class
    |
    File1.txt

我们如何将File1.txt作为文件读取,    我试过下面的代码

ClassLoader classLoader =Main.class.getClassLoader();
File file= new File(classLoader.getResource("File1.txt").getFile());(without slash)

File file= new File(classLoader.getResource("/File1.txt").getFile());(with slash)

使用斜杠我正在忘记空指针异常 和 没有斜线我认为文件名或目录名不正确

3 个答案:

答案 0 :(得分:1)

你不需要"文件"实例读取文件的内容,正如其他人回答的那样,只需使用Stream或URL。 请注意,使用类加载器时路径是绝对的:

 Main.class.getClassLoader().getResourceAsStream("fileAtRoot.txt")

相当于

 Main.class.getResourceAsStream("/fileAtRoot.txt")

如果你真的想要这个文件,它在任何情况下都不会起作用:你可以得到它,如果它是一个文件,但是当它在一个JAR内部时没有要打开的文件,它只会起作用eclipse,或者如果你在类路径中放置一个文件夹而不是jar。

这是一个例子:

免责声明:这是一个反对者,不要实际使用它

public class SOResourceLoad {

  public static void main (String[] args) {
    new SOResourceLoad().run();
  }

  private void run () {
    try {
      URL resource = getClass().getResource("SOResourceLoad.class");
      System.out.println( resource );
      System.out.println( resource.toURI() );
      System.out.println( new File(resource.toURI()) );
    } catch (URISyntaxException e) {
      e.printStackTrace();
    }

  }

}

Eclipse的结果

file:/D:/opt/workspace/examples/target/classes/pdem/stackoverflow/SOResourceLoad.class
file:/D:/opt/workspace/examples/target/classes/pdem/stackoverflow/SOResourceLoad.class
   D:\opt\workspace\examples\target\classes\pdem\stackoverflow\SOResourceLoad.class

jar文件的结果:

jar:file:/D:/opt/sodist.jar!/pdem/stackoverflow/SOResourceLoad.class
jar:file:/D:/opt/sodist.jar!/pdem/stackoverflow/SOResourceLoad.class
Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical
    at java.io.File.<init>(File.java:418)
    at pdem.stackoverflow.SOResourceLoad.run(SOResourceLoad.java:25)
    at pdem.stackoverflow.SOResourceLoad.main(SOResourceLoad.java:17)

stacktrace告诉我们,当我们执行jar文件时,我们无法获取文件。

答案 1 :(得分:0)

getClass().getResourceAsStream("File1.txt") 

但是,通常,您将资源存储在项目内和/或jar根目录下的资源目录下。所以我会稍微更改一下结构,将资源目录放在项目的根目录下,也可以放在jar的目标结构下,然后将File1.txt放在那里。所以,新的加载命令就是这样的:

getClass().getResourceAsStream("resources/File1.txt")

答案 2 :(得分:0)

首先,您需要检查您的类加载器,然后加载文件:

ClassLoader cl = Thread.currentThread().getContextClassLoader();
if (cl == null) {
    cl = Class.class.getClassLoader();
}
cl.getResourceAsStream("File1.txt");