我用过了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)
最佳答案
URL.getFile()不会将URL转换为文件。它仅返回URL的路径和查询部分。该方法之所以被命名为getFile(),仅是因为URL类是Java 1.0的一部分,该Java版本于1995年发布,当时大多数URL都指向实际文件。
URL.getFile()返回的路径返回一个字符串,该字符串可能是有效的文件路径,也可能不是有效的文件路径。 URL中可能没有合法出现许多字符,因此它们将百分号转义。一个很好的例子是空格。例如file:///C:/Program%20Files/Java
。
简而言之,使用getFile()将URL转换为文件并不安全,并且最终将失败。
此外,.jar文件中的条目也不是文件。 .jar文件是单个存档文件。它的条目只是字节的子序列(代表压缩数据)。另一方面,即使getResource返回的URL表示一个.jar条目,它也始终是有效的(假定它不为null)。