Прочитать содержимое файла JAR по указанному пути - PullRequest
0 голосов
/ 09 марта 2012

У меня есть JAR-файл с именем «san.jar» с различными папками, такими как «классы», «ресурсы» и т. Д., Скажем, например, у меня есть структура папок, такая как «resources / assets / images», в которой находятся различные изображения, о которых у меня нет никакой информации, например, название изображений или количество изображений в папке, поскольку файл 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.

Ответы [ 3 ]

0 голосов
/ 09 марта 2012

Это можно сделать гораздо более кратко с помощью регулярных выражений ... Это также будет работать, когда файлы 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();
0 голосов
/ 17 марта 2015

С 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 будет искать только указанный путь до желаемой глубины.

0 голосов
/ 09 марта 2012

Этот код работает для вашей цели

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();
...