【问题标题】:classLoader.getResource doesn't work in jar fileclassLoader.getResource 在 jar 文件中不起作用
【发布时间】:2014-10-31 12:45:21
【问题描述】:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL url = classLoader.getResource("com/x/y/z.cfg");
File file = new File(url.getPath());

这在从 Eclipse 运行 jar 文件时有效,但在 jar 文件中运行时无效。

java.io.FileNotFoundException: 文件:\C:\Users\nova\Desktop\Matcher.jar!\c om\x\y\z.cfg

这不是重复的。我检查了所有其他问题,没有有用的信息。

【问题讨论】:

  • 收到File 后,您想做什么?您不能从为 JAR 中的资源获得的 URL 创建 File(因为它不是 file: URL,通常是 jar:file:/path/to/file.jar!/com/x/y/z.cfg),但如果您使用的 API 可以接受URLInputStream 而不是 File 那么你不需要。
  • 这个解释了很多遍:here, here, here。真正的原因是因为 File 表示文件系统对象,而文件系统无法访问 jar 的内容(但 Java 可以以某种方式处理它 - 作为 InputStream)。
  • URL.getFile() 将 URL 转换为有效的文件路径。它仅返回 URL 的路径部分。 (在 Java 1.0 时代,大多数 URL 引用物理文件;这就是该方法被命名为 getFile 的原因。)

标签: java eclipse


【解决方案1】:

当文件被捆绑在 jar 中时,它变成字节流而不是普通的 File 对象。

试试

InputStream stram=getClass().getClassLoader().getResourceAsStream(relativePath);

More Tutorial...

阅读类似的帖子herehere

【讨论】:

    【解决方案2】:

    您无法创建 File 实例,因为您拥有的唯一文件是 JAR。这就是 getResource() 返回 URL 的原因。您可以使用 URL.openStream() 方法获取流来读取内容。

    【讨论】:

      猜你喜欢
      • 2010-12-12
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 2017-08-01
      相关资源
      最近更新 更多