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

时间:2015-07-11 21:07:58

标签: java getfiles

我有获取图片的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 lib中,而我的其他项目想从jar lib中获取文件。

这是我的项目试图从jar lib

获取config.cfg文件
File file = files.getFile("config.cfg");

我已打开jar并检查,如果该文件存在于jar中。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

这取决于你的包装。

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

在Java中获取File就像在运行应用程序的操作系统中获取文件一样。所以如果你有一个“非jar”形式,那么你的代码就可以了。但是如果你有一个JAR应用程序,那么你的操作系统必须支持对打包文件(jar实际上是ZIP存档)的操作,就像在未打包的文件上一样。但是,我不知道这种情况。

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

修改 根据您的评论,您有JAR表单。在这种情况下,从资源获取文件File根本不起作用。