我用过
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)
答案 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条目。