有没有办法使用 ClassLoader 和 getClass() 方法从 res 文件夹中获取文件

Is there a way to get a file from res folder with ClassLoader and getClass() method

我有 loadImage 获取图像的功能。它仅在我尝试从 getFile() 函数获取文件时不起作用。

public BufferedImage loadImage(String img) {
    BufferedImage bimg = null;
    try {
        bimg = ImageIO.read(new File("res/" + img));
    } catch (Exception e1) {
        try {
            bimg = ImageIO.read(ClassLoader.getSystemResource("res/" + img));
        } catch (Exception e2) {
            try {
                bimg = ImageIO.read(getClass().getResource("res/" + img));
            } catch (Exception e3) {
                System.out.println("Cannot load image: " + img);
            }
        }
    }
    return bimg;
}

我试过使用以下函数:

public File getFile(String file) {
    File f = null;
    try {
        f = new File("res/" + file);
    } catch (Exception e1) {
        try {
             f = new File(ClassLoader.getSystemResource("res/" + file).getFile());
        } catch (Exception e2) {
            try {
                f = new File(getClass().getResource("res/" + file).getFile());
            } catch (Exception e3) {
                System.out.println("Cannot load File: " + file);
            }
        }
    }
    return f;
}

这些函数在 jar 库中,我的其他项目想从 jar 库中获取文件。

这是在我的项目中试图从 jar 库中获取 config.cfg 文件

File file = files.getFile("config.cfg");

我已经打开 jar 并检查了 jar 中是否存在该文件。

这取决于你的包装。

请记住,您不必将应用程序打包为 jar 文件 - 它可以是未打包的形式,在单独的目录中包含 类(就像在 jar 文件中但没有它).

在 Java 中获取 File 就像在您作为 运行 应用程序的操作系统中获取文件一样。因此,如果您有一个 "non-jar" 表单,那么您的代码就可以正常工作。但是如果你有一个 JAR 应用程序,那么你的操作系统必须支持对打包文件(jar 实际上是 ZIP 存档)的操作,就像对非打包文件一样。但是,我不知道这种情况。

总而言之 - 从资源(从应用程序的 jar 文件)获取文件将不起作用,因为它应该允许本机文件系统执行普通文件允许的所有操作(复制、粘贴、写入,更改属性等)。以流的形式获取资源是另一回事(它适用于所有情况)。

编辑: 根据您的评论,您有一个 JAR 表格。在这种情况下,从资源中获取文件 File 根本不起作用。

您可以使用 Class.getResourceAsStream(String name)。例如,如果 jar 文件中有 "/data/config.cfg",则可以使用以下行打开该文件进行读取:

InputStream is = this.getClass().getResourceAsStream("/data/config.cfg");