2012-01-10 43 views
6

我有一個函數:爪哇 - 特殊字符的URL

public static ImageIcon GetIconImageFromResource(String path){ 
    URL url = ARMMain.class.getResource(path); 
return new ImageIcon(url); 
} 

它的偉大工程,但如果我C座我的.jar文件到,例如:\戰神!\ myfile.jar失敗我沒有看到我的圖標。我發現我的網址是file:/ C:/ Ares !!!/myfile.jar!/com/test/images/img.png。所以在JAR擴展之後有符號!我認爲這是主要原因!我能做些什麼來避免這個問題?謝謝。

+0

您應該使用相對路徑而不是靜態絕對路徑。 – 2012-01-10 06:18:23

+0

如果你不難解釋我怎麼做?我有標準的** ARMMain.class.getResource(路徑)**函數,它返回的URL。 – Nolesh 2012-01-10 06:28:34

+2

而不是使用'C:/ XYZ/...'使用相對路徑作爲'images/img.png'。 – 2012-01-10 06:31:22

回答

5

這顯然是Java的一個問題(不僅僅是一個bug)。 JAR URL使用!/作爲分隔符,但在文件路徑中出現時不會將其轉義。

您可以嘗試自己逃脫,將Ares!!!/轉換爲Ares!!%21/,但保留myfile.jar!/原樣。


根據RFC3986,!是一個保留子定界符炭。因此,使用它來分隔URL中的不同部分是安全的;當它出現在零件中時,它必須被轉義爲%21

然而,處理JAR URL的Java代碼顯然是遵循較舊的RFC2396,其中!是未預留的字符。 Java選擇一個毫無保留的字符作爲分隔符是不明智的。當它發生時,它應該至少在內部轉義它,就好像字符被保留了一樣。

+0

正如我所見所有用戶和程序員都面臨着嚴重的問題...所以,感謝大家的討論。我要關閉這個線程。 – Nolesh 2012-01-10 08:40:41