获取目录中的所有图像 - 在jar文件中

时间:2012-08-18 04:06:21

标签: java resources io classpath

我的项目中有一个包含238张图像的文件夹。我希望能够找到目录中的所有图像。

我目前正在访问所有这些图片:

File directory = new File(FileNameGuesser.class.getResource(DIRECTORY).getPath());
for (File file : directory.listFiles()) {
    // filter, process, etc.
}

这在Eclipse中运行良好。但是,当我导出到jar文件时,FileNameGuesser.class.getResource(DIRECTORY)会返回C:\Users\...\file.jar!\org\...(因为它是压缩的,我假设)并且方法会中断。

我怎样才能做到这一点?

编辑:如果可能的话,我想在已部署的jar中找到一个适用于Eclipse 的解决方案。

2 个答案:

答案 0 :(得分:2)

这不是真正可能以任何漂亮和干净的方式。

能够做.getClass().getResources("/pictures/*.jpg")(或某事)会很高兴,但我们做不到。

你能做的最好就是作弊。如果您知道存储图像的jar文件的名称,则可以使用JarFileZipFile API来获取列表:

ZipFile zipFile = null;
try {

    zipFile = new ZipFile(new File("...")); // Path to your Jar
    Enumeration<? extends ZipEntry> entries = zipFile.entries();
    while (entries.hasMoreElements()) {

        ZipEntry entry = entries.nextElement();

        // Here, I've basically looked for the "pictures" folder in the Zip
        // You will need to provide the appropriate value
        if (!entry.isDirectory() && entry.getName().startsWith("pictures")) {

            // Basically, from here you should have the full name of the
            // image.  You should be able to then construct a resource path
            // to the image to load it...

            // URL url = getClass().getResource("/" + entry.getName());
            System.out.println(entry.getName());

        }

    }

} catch (Exception exp) {

    exp.printStackTrace();

} finally {


    try {
        zipFile.close();
    } catch (Exception e) {
    }

}

如果您事先不知道他们的名字,那么更好的解决办法就是不要将这些图像嵌入您的罐子里。

嵌入式资源确实应该事先通过名称告知您的应用程序。

根据AndrewThompson的建议,您可以生成资源列表,将其添加到Jar文件中。在运行时,您将加载此文件并可以访问所有资源。

答案 1 :(得分:0)

您可以使用Spring提供的PathMatchingResourcePatternResolver

public class SpringResourceLoader {

    public static void main(String[] args) throws IOException {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        // Ant-style path matching
        Resource[] resources = resolver.getResources("/pictures/**");

        for (Resource resource : resources) {
            System.out.println("resource = " + resource);
            InputStream is = resource.getInputStream();
            BufferedImage img =  ImageIO.read(is);
            System.out.println("img.getHeight() = " + img.getHeight());
            System.out.println("img.getWidth() = " + img.getWidth());
        }
    }
}

我没有对返回的Resource做任何想象,但是你得到了照片。

将此添加到您的maven依赖项(如果使用maven):

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>

这将直接在已部署的jar中的Eclipse / NetBeans / IntelliJ 中使用。

从IntelliJ内部运行,给出了以下输出:

resource = file [C:\Users\maba\Development\stackoverflow\Q12016222\target\classes\pictures\BMW-R1100S-2004-03.jpg]
img.getHeight() = 768
img.getWidth() = 1024

从带有可执行jar的命令行运行,给出了以下输出:

C:\Users\maba\Development\stackoverflow\Q12016222\target>java -jar Q12016222-1.0-SNAPSHOT.jar
resource = class path resource [pictures/BMW-R1100S-2004-03.jpg]
img.getHeight() = 768
img.getWidth() = 1024