在Intellij中构建工件后,Java getResource找不到文件

时间:2017-07-28 13:29:08

标签: java file intellij-idea import

我用过

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

从我的资源文件夹中获取txt文件,它在IDE内部工作正常,但是当构建到jar并在环境外运行时,它会抛出找不到文件的错误(我通过在CMD中运行看到)。

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

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

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

错误CMD给出: JLS

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)

2 个答案:

答案 0 :(得分:1)

使用getResourceAsStream()代替getResource():有关详细信息,请参阅此SO answer

答案 1 :(得分:0)

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

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

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

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