从getResource("...")构造一个字符串给出一个以"file:/"开头的输出?



让我们考虑image.png存储在一个名为icon的项目包之一中,我通常通过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:/有什么好处?
我认为路径可能是文件的路径,但我错了,即使定位到文件夹也会给出此输出。

它是特定于文件的 URL 路径。有点像网络 URL 如何 http://https://ftp:// 文件的 URL 保留该语法,因此 file:/ 诞生了。

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

然后打开浏览器并键入:文件:/C:/测试.jpg

输入应该加载图像。

文件有什么好处:/添加到字符串中?

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

有关详细信息,请参阅文件 URI 方案

方法Class.getResources(String)返回一个URL。 此URL可能是本地文件的,在这种情况下,它将以file:/协议开头。 但是,您的应用程序或此类可能从 JAR 文件运行,并且资源可能包含在 JAR 文件中。 Sun为这些案例创建了jar:/协议。 然后,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 未指向纯文件,则无法从字符串中删除file:/

我确实编辑了你的帖子:你用了两次img

最新更新