2017-07-28 56 views
0
建設神器

我用的Java的getResource中的IntelliJ

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

從我的資源文件夾獲取txt文件後沒有找到文件,它工作正常時,IDE內部,而是建立一個罐子時和運行在環境之外它拋出文件沒有發現錯誤(我看到通過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) 
+0

是不工作的文件,實際上包含在.jar文件中? – TmTron

+0

@TmTron我用winrar打開了jar,發現文本文件都在那裏 – Taka

+0

嘗試用try catch來包圍失敗的調用併發布錯誤消息。 – TmTron

回答

0

URL.getFile()一個URL轉換爲一個文件。它僅僅返回URL的路徑和查詢部分。該方法僅被命名爲getFile(),因爲URL類是1995年發佈的Java 1.0的一部分,當大多數URL碰巧指向實際文件時都返回。

URL.getFile()返回的路徑返回一個字符串,它可能是也可能不是有效的文件路徑。許多字符可能不合法地出現在URL中,因此它們將被百分比轉義。一個很好的例子是空間;例如,file:///C:/Program%20Files/Java

總之,使用getFile()將URL轉換爲文件是不安全並最終會失敗。

另外,.jar文件中的條目不是文件。 .jar文件是單個存檔文件。它的條目只是字節的子序列(表示壓縮數據)。另一方面,getResource返回的URL總是有效的(假設它不是null),即使它代表.jar條目。

+0

感謝一羣將考慮替代 – Taka

1

使用getResourceAsStream()代替getResource():看到這個SO answer的細節

相關問題