Java 从可执行JAR文件递归读取图像

Java 从可执行JAR文件递归读取图像,java,arraylist,jar,java-8,executable-jar,Java,Arraylist,Jar,Java 8,Executable Jar,我试图显示存储在ArrayList中的许多BuffereImage元素,方法是首先将它们从磁盘读取到ArrayList,然后遍历ArrayList。由于图像被组织到文件系统上的子文件夹中,因此我使用 private void storeImages(final File folder) { for (final File fileEntry : folder.listFiles()) { if (fileEntry.isDirectory()) {

我试图显示存储在
ArrayList
中的许多
BuffereImage
元素,方法是首先将它们从磁盘读取到ArrayList,然后遍历ArrayList。由于图像被组织到文件系统上的子文件夹中,因此我使用

private void storeImages(final File folder) {
    for (final File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            storeImages(fileEntry);// recursively iterates across all
                                    // subdirectories in folder
        } else {
            try {
                imageList.add(ImageIO.read(fileEntry));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
如果我使用
JFileChooser
选择要调用
storeImages
的目录,那么代码工作正常。但是,我想将图像打包到一个可执行的JAR文件中,这样图像就不必单独分发,用户也不必在磁盘上找到存储图像的位置。为了尝试从JAR中读取文件,我尝试了

storeImages(new File(getClass().getResource("/images").toString());

但这会抛出一个
NullPointerException
。如果推到紧要关头,我可以从文件系统中读取图像,尽管我更喜欢从JAR文件中读取它们。要从JAR中读取图像,我应该做些什么?

不幸的是,您的代码不会像自动浏览JAR文件那样可重用,因为您无法从JAR文件的内容创建
文件
实例。这篇文章介绍了这一点:


还有一个类似的问题提出了一个可能的解决方案:

考虑使用
getResourceAsStream
谢谢!我没有意识到
File
类对于JAR文件的限制,这取决于您对古老API的坚持程度。毕竟,当解决方案已经存在了几年的时候,抱怨旧API的局限性没有多大意义;不要使用
文件
,使用
路径
。是一个示例代码,它列出了
包中的类
,而不管它们是存储为文件还是存储在存档中。对它进行修改以列出其他类型的文件应该很容易,但是请注意,如果您想读取某一类型的所有条目,线性扫描zip文件比递归扫描更有效。