【问题标题】:Java getResource does not find file after building artifact in Intellij在 Intellij 中构建工件后,Java getResource 找不到文件
【发布时间】:2018-01-04 14:26:04
【问题描述】:

我用过

File file = new File(Game.class.getResource("Tiles.txt").getFile())

从我的资源文件夹中获取 txt 文件,它在 IDE 中运行良好,但是当构建到 jar 并在环境之外运行时,它会抛出未找到文件的错误(我通过在 CMD 中运行看到)。

我使用类似的方法来获取我所有的图像和精灵表:

BufferedImage loadedImage = ImageIO.read(Game.class.getResourceAsStream("EG.png"));

它们在导入文件方面有何不同?为什么我的路径不正确?

错误 CMD 给出: http://imgur.com/a/1SC1L

C:\Users\Taka\Desktop>java -jar ProjectC-Revamped.jar
java.io.FileNotFoundException: file:\C:\Users\Taka\Desktop\ProjectC-Revamped.jar!\Tiles.txt (The filename, directory name, or volume label syntax is incorrect)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.util.Scanner.<init>(Unknown Source)
        at Tiles.<init>(Tiles.java:16)
        at Game.<init>(Game.java:91)
        at Game.main(Game.java:192)
java.io.FileNotFoundException: file:\C:\Users\Taka\Desktop\ProjectC-Revamped.jar!\Maps\Map.txt (The filename, directory name, or volume label syntax is incorrect)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.util.Scanner.<init>(Unknown Source)
        at Map.<init>(Map.java:20)
        at Game.<init>(Game.java:94)
        at Game.main(Game.java:192)

【问题讨论】:

  • 是那个不起作用的文件,居然包含在.jar文件中?
  • @TmTron 我用winrar打开jar,发现里面都是文本文件
  • 尝试用 try catch 包围失败的调用并发布错误消息。
  • @TmTron 已添加到帖子中
  • 不要发布堆栈跟踪的图片。将实际文本复制并粘贴到您的问题中。

标签: java file intellij-idea import


【解决方案1】:

URL.getFile() 将 URL 转换为文件。它仅返回 URL 的路径和查询部分。该方法之所以命名为 getFile() 只是因为 URL 类是 Java 1.0 的一部分,该版本于 1995 年发布,当时大多数 URL 恰好指向实际文件。

URL.getFile() 返回的路径返回一个字符串,它可能是也可能不是有效的文件路径。许多字符可能不会合法地出现在 URL 中,因此它们将被百分比转义。一个很好的例子是空间;例如,file:///C:/Program%20Files/Java

简而言之,使用 getFile() 将 URL 转换为文件是不安全,最终会失败。

此外,.jar 文件中的条目不是文件。 .jar 文件是单个存档文件。它的条目只是字节的子序列(代表压缩数据)。另一方面,getResource 返回的 URL 始终有效(假设它不为 null),即使它表示一个 .jar 条目。

【讨论】:

    【解决方案2】:

    使用getResourceAsStream() 代替getResource():详情请参阅SO answer

    【讨论】:

      猜你喜欢
      • 2017-08-13
      • 2016-08-12
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多