导出到.jar时从源文件夹加载多个图像

时间:2016-04-09 13:54:58

标签: java loops jar image-loading

我有一个程序有3种方法,用于从特定的源文件夹加载图像。第一个在给定直接路径的情况下加载单个图像。第二个加载来自文件夹的所有图像并将它们存储在ArrayList中。第三个加载文件夹中所有文件夹的所有图像。 (见下面的代码)

当我导出到.jar时,第一种方法工作正常。其他两种方法都失败了。 据我所知,它不起作用,因为你不能在.jar中拥有文件。

因此,代码首先在这里失败:

File dir = new File(LoadImages.class.getResource("/" + directory).getFile());

我考虑过使用FileInputStream,但后来我无法将流分成几部分,以便我可以分配图像。

到目前为止我能想到的唯一工作是

public static ArrayList<BufferedImage> loadImageFolder(String directory) {
    ArrayList<BufferedImage> images = new ArrayList<BufferedImage>();
    int i = 0;
    while (true) {
        try {
            BufferedImage img = ImageIO.read(LoadImages.class.getResource("/" + directory + "[" + i + "].png"));
            images.add(img);
            i++;
        } catch (Exception e) {
            break;
        }
    }
    return images;
}

但这会强制您以特定模式命名文件。这是可能的,因为您可以在导出之前更改文件名,但我想知道是否有一种方法没有它。

提前致谢。

在导出之前的工作方法

之下
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FilenameFilter;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;

public class LoadImages {

    static String extensions = "png";

    static FilenameFilter imageFilter = new FilenameFilter() {

        @Override
        public boolean accept(File dir, String name) {
            if (name.endsWith("." + extensions)) {
                return true;
            }
            return false;
        }
    };

    static FileFilter folderFilter = new FileFilter() {

        @Override
        public boolean accept(File f) {
            if (f.isDirectory()) {
                return true;
            }
            return false;
        }
    };

    public static BufferedImage loadImage(String imageFile) {
        BufferedImage img = null;
        try {
            img = ImageIO.read(LoadImages.class.getResource("/" + imageFile));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return img;
    }

    public static ArrayList<BufferedImage> loadImageFolder(String directory) throws IOException {
        File dir = new File(LoadImages.class.getResource("/" + directory).getFile());
        ArrayList<BufferedImage> images = new ArrayList<BufferedImage>();
        if (dir.isDirectory()) {
            for (File f : dir.listFiles(imageFilter)) {
                BufferedImage img = null;

                try {
                    img = ImageIO.read(f);
                    images.add(img);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    public static ArrayList<ArrayList<BufferedImage>> loadImageFoldersInFolder(String directory) {

        File dir = new File(LoadImages.class.getResource("/" + directory).getFile());
        ArrayList<ArrayList<BufferedImage>> folders = new ArrayList<ArrayList<BufferedImage>>();
        if (dir.isDirectory()) {
            ArrayList<BufferedImage> imagesHere = new ArrayList<BufferedImage>();
            for (File f : dir.listFiles(imageFilter)) {
                BufferedImage img = null;

                try {
                    img = ImageIO.read(f);
                    imagesHere.add(img);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            folders.add(imagesHere);
            for (File f : dir.listFiles(folderFilter)) {
                ArrayList<BufferedImage> folder = new ArrayList<BufferedImage>();
                for (File x : f.listFiles(imageFilter)) {
                    BufferedImage img = null;

                    try {
                        img = ImageIO.read(x);
                        folder.add(img);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                folders.add(folder);
            }
        }
        return folders;
    }

}

2 个答案:

答案 0 :(得分:0)

嗯,首先,你要将目录更改为只说文件名,然后,最好的方法是将创建的.jar变为.zip,解压缩,添加图像文件到解压缩的文件夹(或直接到zip),然后再次重命名为.jar。

答案 1 :(得分:0)

你的方法不起作用,因为你在jar文件中没有任何dircetories而不是因为你的jar中没有文件。

所以在一个jar文件中,你只有一个级别,你的所有文件都是。文件名是路径+你是原始文件名。

这就是img = ImageIO.read(LoadImages.class.getResource("/" + imageFile));工作的原因。

File dir = new File(LoadImages.class.getResource("/" + directory).getFile());

不起作用,因为该目录不再存在。