【问题标题】:Java read file from resources from jarJava从jar中的资源读取文件
【发布时间】:2018-06-04 22:02:43
【问题描述】:
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

【问题讨论】:

  • 你能解释一下为什么你不能使用getResourceAsStream吗?此外,你能分享一下jar'files结构吗? (展开文件夹)
  • @ Eleazar Enrique 我在资源中有 chromedriver.exe,我需要获取路径并设置为系统属性: System.setProperty("webdriver.chrome.driver","myPath/chromedriver.exe");
  • @ip696 使用您问题下方的编辑链接并将其放入您的问题中。您的问题显示的不是您需要的 - 您的问题显示在 Java 中读取文件,但您需要的是获取绝对路径。确保您的问题准确无误。

标签: java maven jar


【解决方案1】:

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

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

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

【讨论】:

  • 我写了我的问题 - 不想使用 getResourceAsStream
  • 这是一个简单的例子。之后我需要获取真实路径并设置为 System.property
  • 对不起,我错过了。问题的原因仍然存在,而且我不知道有任何其他方法可以获取资源的内容。您可能应该详细说明为什么您不能使用它。
  • 嗯,没有真正的路径可以得到。该文件是 jar 的一部分,并且没有指向它的有效文件系统路径。
  • 我需要像这样创建 stackoverflow.com/a/46926284/4781349 但我在资源中有 chromedriver.exe
【解决方案2】:
File file = new File(resource.getPath());

Bzzt。资源不是文件。你有一个网址。直接使用它的输入流。

【讨论】:

    【解决方案3】:

    将 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();
    

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 2021-11-21
      相关资源
      最近更新 更多