我有这样一段代码
private Image createImage(String path)
{
URL imageURL = getClass().getResource(path);
if (imageURL == null)
{
System.err.println("Resource not found: " + path);
return null;
}
else
{
return (new ImageIcon(imageURL)).getImage();
}
}
当我使用 jar 文件运行应用程序时,
getResource()
的路径设置为 /data/ico.png
并且因为位于 ico.png
中的 jar app.jar/data/ico.png
文件内,一切正常并且创建了图像。isdebug
,基于我将路径更改为 ..\\..\\..\\data\\ico.png
。结果我没找到ico.png
。getResource()
还是我只是错过了 png 文件?src.packageA.packageB.MainClass.java
并且 ico.png 位于里面
data\ico.png
===解决办法===
我发现我的结构的正确路径是
../../../../data/ico.png
。在此配置中,位于 a.b.gui.MyClass 中的 ico.png
已正确加载。我还注意到搜索的目录是
MyClass.class.getResource()
bin
!这是重要的信息,因为在调试模式下启动 Eclipse 根文件夹不是项目文件夹,而是 src
。bin
- 不。但是,
..
允许您以斜线开头,这意味着相对于该类路径条目的 root来查找资源。例如,如果你的罐子中有这样的结构:
getResource
(即,这就是您运行
mypkg/MyClass.class
mypkg/icons/icon1.png
logos/logo1.png
时看到的内容),然后您就可以访问所有这些:
jar tvf myjar.jar
一些注意事项:
MyClass.class.getResource("icons/icon1.png");
MyClass.class.getResource("/mypkg/icons/icon1.png");
MyClass.class.getResource("/mypkg/logos/logo1.png");
getClass().getResource()
是正确的。当你子类化时,MyClass.class.getResource()
会中断。即使你不这样做,编写脆弱的代码也不好。 这里永远不要使用反斜杠。这是 Windows 的事情,因此无关紧要 - (即使您在 Windows 上运行 Java 应用程序,您也会使用正斜杠。您传递给 getResource 的东西是资源标识符,而不是路径。这与
getClass()