Java - 特殊的URL字符

6

我有一个函数:

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

它很好用,但如果我将我的JAR文件放在例如C:\Ares!!!\myfile.jar上就会失败,我看不到我的图标。我观察到我的URL是file:/C:/Ares!!!/myfile.jar!/com/test/images/img.png。所以在JAR扩展名后面有!符号!我认为这是主要原因!我该怎么避免这个问题?谢谢。


你应该使用相对路径而不是静态绝对路径。 - Harry Joy
如果您方便的话,能否向我解释一下如何操作?我有一个标准的 ARMMain.class.getResource(path) 函数,它返回URL。 - Nolesh
2
不要使用 C:/XYZ/...,而是使用相对路径 images/img.png - Harry Joy
从资源中获取图标图像("images/img.png") - 我也是这样做的。有什么建议吗? - Nolesh
你能把图片打包到JAR文件之外吗?我通常会把它们放在外面,然后使用images/img.png。 - aishwarya
很遗憾,我不能这样做。我必须将它保留在JAR文件中。 - Nolesh
2个回答

5

这似乎是一个Java的问题(而不仅仅是bug)。JAR URL使用!/作为分隔符,但在文件路径中出现时不对其进行转义。

您可以尝试自行转义它,将Ares!!!/变为Ares!!%21/,但保留myfile.jar!/不变。


根据RFC3986规定,!是一个保留的子分隔符字符。因此,在URL中使用它来分隔不同的部分是安全的;当它出现在某个部分内部时,必须将其转义为%21

然而,处理JAR URL的Java代码显然遵循较旧的RFC2396,其中!是未保留的字符。Java选择未保留的字符作为分隔符是不明智的。当它这样做时,至少应在内部对其进行转义,就好像该字符是保留字符一样。


据我所见,这对所有用户和程序员来说都是一个大问题...因此,感谢大家的讨论。我打算关闭这个线程。 - Nolesh

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接