使用 getClass().getResource() 加载资源

2022-09-01 16:46:44

我正在尝试加载图像以用作应用程序中的图标。根据本教程,适当的方法是:

protected ImageIcon createImageIcon(String path, String description) 
{
    java.net.URL imgURL = getClass().getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL, description);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}

因此,我放置了文件的位置,并将其作为参数传递给此函数。这不起作用,即imgURL为空。当我尝试通过显式传入路径来创建图像图标时:

ImageIcon icon  = new ImageIcon(path,"My Icon Image");

它工作得很好!因此,应用程序可以从显式定义的路径中获取图像,但不会使用 getResources() 拾取图像。在这两种情况下,路径变量的值是相同的。为什么它不起作用?类装入器如何找到资源?

谢谢。


答案 1

getClass().getResource(path)从类路径加载资源,而不是从文件系统路径加载资源。


答案 2

您可以按以下格式请求路径:

/package/path/to/the/resource.ext

甚至在内存中创建类的字节也是这样找到的:

my.Class -> /my/Class.class

并将为您提供一个可用于检索 .getResourceInputStream

但。。。我建议直接使用相同的参数,因为它直接返回 InputStream,并且不必担心创建一个(可能很复杂的)URL 对象,该对象必须知道如何创建 InputStream。getClass().getResourceAsStream(...)

简而言之:尝试使用,并且它的一些构造函数使用 a 作为参数。getResourceAsStreamImageIconInputStream

类装入器

如果你的应用具有许多类加载器,请小心。如果你有一个简单的独立应用程序(没有服务器或复杂的东西),你不应该担心。我不认为这是提供的情况能够找到它。ImageIcon

编辑:类路径

getResource正如 mattb 所说,用于从类路径(从.jar或类路径目录)加载资源。如果你正在捆绑一个应用程序,那么完全拥有它是很好的,所以你可以将图标文件包含在你的应用程序的jar中,并以这种方式获取它。


推荐