Java从jar资源中读取文件

问题描述 投票:-1回答:3
public class Main {
  public static void main(String[] args) throws IOException {
    System.out.println("----------Start------------------");
    URL resource = Main.class.getClassLoader().getResource("test.txt");
    System.out.println("resource: "+ resource.getPath());

    File file = new File(resource.getPath());
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String line;
    while ((line = reader.readLine()) != null) {
      System.out.println(line);
    }
    reader.close();
    System.out.println("----------End------------------");
  }
}

如果我从IDEA运行此代码 - 所有工作

----------Start------------------
resource: /D:/javaHz/target/classes/test.txt
1
2
3
4
5
----------End------------------

进程以退出代码0结束

如果我从java -jar运行 - 我得到错误

D:\hz>java -jar hzTest-jar-with-dependencies.jar
----------Start------------------
resource: file:/D:/hz/hzTest-jar-with-dependencies.jar!/test.txt
Exception in thread "main" java.io.FileNotFoundException: D:\hz\file:\D:\hz\hzTe st-jar-with-dependencies.jar!\test.txt (Syntax error in file name, folder name, or volume label)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at java.io.FileReader.<init>(FileReader.java:58)
        at test.Main.main(Main.java:15)

我不想使用getResourceAsStream

java maven jar
3个回答
2
投票

new File(resource.getPath())无法正常工作,因为file:/D:/hz/hzTest-jar-with-dependencies.jar!/test.txt并不是真正的文件系统路径。

由于该文件是jar文件(实际上是zip存档)的一部分,因此没有指向它的有效文件系统路径。

标准方法是使用getClassLoader().getResourceAsStream("test.txt");。您必须修改应用程序以便它可以从类路径资源或URL读取,或使用getResourceAsStream()将资源复制到文件系统上的临时文件,然后指向它。


-1
投票
File file = new File(resource.getPath());

Bzzt。资源不是文件。你有一个URL。直接使用其输入流。


-1
投票

将URL转换为可在Java外部使用的绝对路径的正确方法是:

import java.net.URL;
import java.nio.file.Paths;

URL resource = Main.class.getClassLoader().getResource("test.txt");
String absolutePath = Paths.get(resource.toURI()).toAbsolutePath());

这只适用于资源来自file:// url的情况 - 如果你的应用程序是作为jar文件构建的,它将无法工作,因为其他应用程序无法直接查看jar文件。

它看起来有点复杂,而且确实如此。为了打破这一点:

URL resource = ...;
URI uri = resource.toURI();
Path path = Paths.get(uri);
String absolutePath = path.toAbsolutePath();
© www.soinside.com 2019 - 2024. All rights reserved.