0

我有一个名为“san.jar”的 jar 文件,其中包含“类”、“资源”等各种文件夹,例如,我有一个文件夹结构,如“资源/资产/图像”,其中有各种图像,我没有关于它们的任何信息,例如文件夹下的图像名称或图像数量,因为 jar 文件是私有的,我不允许解压缩 jar。

目标:我需要在不遍历整个 jar 文件的情况下获取给定路径下的所有文件。

现在我正在做的是遍历每一个条目,每当我遇到 .jpg 文件时,我都会执行一些操作。这里只是为了阅读“资源/资产/图像”,我正在遍历整个 jarfile。

JarFile jarFile = new JarFile("san.jar");  
for(Enumeration em = jarFile.entries(); em.hasMoreElements();) {  
                String s= em.nextElement().toString();  
                if(s.contains("jpg")){  
                   //do something  
                }  
 }  

现在我正在做的是遍历每一个条目,每当我遇到 .jpg 文件时,我都会执行一些操作。这里只是为了阅读“资源/资产/图像”,我正在遍历整个 jarfile。

4

3 回答 3

1

使用 Java 8 和文件系统现在很容易,

Path myjar;
try (FileSystem jarfs = FileSystems.newFileSystem(myjar, null)) {
   Files.find(jarfs.getPath("resources", "assets", "images"), 
              1, 
              (path, attr) -> path.endsWith(".jpg"),
              FileVisitOption.FOLLOW_LINKS).forEach(path -> {
            //do something with the image.
    });
}

Files.find 只会搜索提供的路径到所需的深度。

于 2015-03-17T19:46:54.533 回答
0

此代码符合您的目的

JarFile jarFile = new JarFile("my.jar");

    for(Enumeration<JarEntry> em = jarFile.entries(); em.hasMoreElements();) {  
        String s= em.nextElement().toString();

        if(s.startsWith(("path/to/images/directory/"))){
            ZipEntry entry = jarFile.getEntry(s);

            String fileName = s.substring(s.lastIndexOf("/")+1, s.length());
            if(fileName.endsWith(".jpg")){
                InputStream inStream= jarFile.getInputStream(entry);
                OutputStream out = new FileOutputStream(fileName);
                int c;
                while ((c = inStream.read()) != -1){
                    out.write(c);
                }
                inStream.close();
                out.close();
                System.out.println(2);
            }
        }
    }  
    jarFile.close();
于 2012-03-09T08:09:01.717 回答
0

这可以通过正则表达式更简洁地完成......当 jpg 文件具有大写扩展名 JPG 时,它也可以工作。

JarFile jarFile = new JarFile("my.jar");

Pattern pattern = Pattern.compile("resources/assets/images/([^/]+)\\.jpg",
        Pattern.CASE_INSENSITIVE);

for (Enumeration<JarEntry> em = jarFile.entries(); em
        .hasMoreElements();) {
    JarEntry entry = em.nextElement();

    if (pattern.matcher(entry.getName()).find()) {
        BufferedImage image = ImageIO.read(jarFile
                .getInputStream(entry));
        System.out.println(image.getWidth() + " "
                + image.getHeight());

    }
}
jarFile.close();
于 2012-03-09T10:18:26.460 回答