【问题标题】:Finding a resource in Java在 Java 中查找资源
【发布时间】:2015-08-29 21:07:13
【问题描述】:

我正在开发一个显示大量图像的 Java 应用程序。问题是我不知道如何让 Java 找到这些图像。

我在 * 上遵循了几个教程和答案,但我仍然没有设法找到一个无论操作系统(Linux 或 Windows)和运行方法(嵌入在 eclipse 上还是导出的 jar 文件)都有效的解决方案。不过,这可能是因为我还是个新手。

我创建了一个类,我称之为 myIcon,我的意思是通过这个类访问所有这些图像。在下面的代码中,我想将字符串“resources/icon/image.gif”传递给函数 getIconPath。输出应该是该图像的 ImageIcon,因为该文件存在。尽管如此,如果我将不存在的图像的路径传递给此函数,则应返回 null。在这种情况下,我的应用程序将显示默认图像(红色 x)。

public class MyIcon {
    // some other functions and properties

    private static final ImageIcon getIconPath(String path) {
        File f = new File(path);

        if (f.exists()) {
            return new ImageIcon(path, "");
        } else {
            return null;
        }
    }
}

资源文件夹是我的目录结构中的 src 文件夹的同级文件夹。也就是说,resources 和 src 都是根目录的子文件夹。

当我运行上面的代码时,没有找到任何图像。因此始终显示默认图像并且 getIconPath 返回 null。

我也知道ClassLoader的getResource方法,但是我还是不太明白这些东西应该怎么用。

【问题讨论】:

  • 我相信您需要从系统根目录(例如 C:/)传入一个路径,而不是相对于您的项目根目录的路径。

标签: java eclipse


【解决方案1】:

在eclipse中运行时,你应该打印出f.getAbsolutePath()。它可能不指向您的文件。更一般地,您希望将文件作为资源访问。见:

https://docs.oracle.com/javase/tutorial/deployment/webstart/retrievingResources.html

【讨论】:

    【解决方案2】:

    这有两个部分 - 确保在构建 jar 时,图像是其中的一部分,以及访问 jar 中的资源。

    对于第一部分,我猜无论您使用什么来构建一个 jar,它都会将您的图像放入 META-INF 文件夹中,该文件夹应该可以正常工作(如果它不存在,或者与生成的 jar 中的 Java 类/源,这可能会导致查找失败)

    第二部分还有另一个Stack Overflow Post。关键是确保要加载的图像在类路径中。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      如果resources 在类路径中,您可以使用getResource(String name)getResourceAsStream(String name) 在类路径中查找图像。

      但是,在一个简单的 Java 项目中,甚至在构建路径中添加resources,如下所示:

      它只会将文件夹内容,换句话说,只是icon/...,放到bin文件夹中,如下所示:

      因此,由于resources 不在类路径中,而只是icon,要检索图像,您只需将路径通知为/icon/image.gif,如下所示:

      URL url = YourClass.class.getResource("/icon/image.gif");
      ImageIcon icon = new ImageIcon(url);
      

      【讨论】: