2

让我们考虑image.png存储在一个名为icons的项目包中,我通常通过以下getResource()方法获取图标:

String imgPath = getClass().getResource("/icons/image.png").toString();
//no problem with creating an ImageIcon with this path
Image img = new ImageIcon(imgPath).getImage();
//but the problem occures when trying to open this image through Desktop
//try-catch
Desktop.getDesktop().open(imagePath);
//or
File imgFile = new File(imgPath);
//error, this file does not exist!

我注意到从 URL 构造一个字符串会给出以 开头的输出,file:/....加载图像没有问题,但在删除之前无法打开文件file:/

file:/添加到字符串中的好处是什么?
我以为路径可能是一个文件,但我错了,即使定位到文件夹也会给出这个输出。

4

2 回答 2

1

它是特定于文件的 URL 路径。有点像 web URL 有http://https://ftp://文件的 URL 保持这种语法,因此file:/诞生了。

例如,将test.jpg 之类的图像复制到C盘。

然后打开浏览器并输入: file:/c:/test.jpg

点击ENTER并加载图像。

添加到字符串中的 file:/ 有什么好处?

没有真正的好处,除了它成为一个有效的 URL 之外,它只能用作 URL 而不是文件的有效路径,因为你会省略 file:/ 如你所见

有关更多信息,请参见文件 URI 方案

于 2013-06-28T21:00:51.377 回答
1

该方法Class.getResources(String)返回一个URL. 这URL可能是本地文件的文件,在这种情况下,它将以file:/协议开头。但是,您的应用程序或此类可能从 JAR 文件中运行,并且资源可能包含在 JAR 文件中。Sunjar:/为这些情况创建了协议。然后,URL可能被字符串化为jar:file:/myapp.jar!/com/azad/images/image.png。因此,不要使用基于文件的方法,而是使用基于 URL 的方法:

URL imgURL = getClass().getResource("/icons/image.png");
//no problem with creating an ImageIcon with this URL
Image img = new ImageIcon(imgURL).getImage();

ImageIcon有一个构造函数,它接受一个URL. 也看看JarURLConnection类。您不能依赖Desktop为您打开 URL;该类只处理文件。如果您的 URL 未指向纯文件,则无法file:/从字符串中删除 。

我确实编辑了您的帖子:您使用img了两次。

于 2013-06-28T21:12:34.220 回答