【问题标题】:Can't access file in .jar via URL无法通过 URL 访问 .jar 中的文件
【发布时间】:2016-04-28 03:31:38
【问题描述】:

我需要使用 URL 访问当前执行的 .jar 中的文件。

URL url = BlockConverter.class.getResource("/test.txt");
System.out.println(url.toString());
InputStream  is = url.openStream();

这就是我所做的。 输出是:

jar:file:/C:/Users/User/Desktop/SERVER/plugins/MyJar.jar!/test.txt

我的 InputStream 在初始化时总是会抛出 IOException,即使 URL 输出正确。 那怎么可能呢? 为什么我打不开直播?

编辑: 另外,请不要回答“use getResourceAsStream”,因为它使用的是同一种代码:

public InputStream getResourceAsStream(String name) {
    URL url = getResource(name);
    try {
        return url != null ? url.openStream() : null;
    } catch (IOException e) {
        return null;
    }
}

【问题讨论】:

  • 来自 IOException 的消息是什么?就此而言,您的 jar 是否在其根目录中有 test.txt?
  • 好的,非常感谢。在对代码进行一些更改后,我没有读取堆栈跟踪,结果发现文件名中的无效字符导致了 IOException,而不是流。非常感谢你的想法,我现在会羞愧地哭泣。
  • 相信我,您不是第一个在堆栈跟踪中错过消息的人。不是由一个长镜头。 :P

标签: java file jar


【解决方案1】:

我会将其作为流直接打开例如

InputStream  is = BlockConverter.class.getResourceAsStream("/test.txt");

上述方法是我通常访问 jar 中资源的方式(它会打开资源,无论它是打包在 jar 中,还是简单地作为未打包的部署,注意)

【讨论】:

  • 我尝试过,但结果相同。除此之外,无论如何我都需要记录 URL,所以这似乎是更清洁的解决方案。
  • 还要注意getResourceAsStream()在其源代码中使用了url.openStream(),所以没有区别。
  • test.txt 与 BlockConverter 的关系在哪里?以上建议它应该位于 jar 文件的根目录中。如果你得到一个空流,我认为你的 jar 包装或对实体的引用是错误的
  • 在jar文件的根目录下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2021-12-20
  • 2021-01-07
  • 2018-10-17
  • 2013-09-29
相关资源
最近更新 更多