1

我的项目中有一个包含 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\...(因为它是压缩的,我假设)并且方法中断。

我怎样才能做到这一点?

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

4

2 回答 2

2

实际上不可能以任何漂亮而干净的方式实现。

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

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

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) {
    }

}

如果您事先不知道它们的名称,更好的解决方案是不要将这些图像嵌入到您的 jar 中。

嵌入式资源确实应该提前知道您的应用程序的名称。

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

于 2012-08-18T04:22:58.200 回答
0

您可以使用PathMatchingResourcePatternResolverSpring 提供的。

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>

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

从 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
于 2012-08-18T05:55:26.610 回答