java.util.zip имеет проблемы с периодами в именах файлов / каталогов? - PullRequest
1 голос
/ 29 января 2011

Я хочу разархивировать файл .ipa приложения iPhone. Это на самом деле ZIP-файл, который извлекает нормально. Но фактический файл приложения в нем является папкой с окончанием .app (поскольку все приложения Mac на самом деле являются папками с окончанием .app). Теперь, кажется, проблема с java.util.zip.

public static void main(String[] args) throws IOException {
    ZipFile zipFile = new ZipFile("file.zip");
    String path = "";

    Enumeration files = zipFile.entries();

    while (files.hasMoreElements()) {
        ZipEntry entry = (ZipEntry) files.nextElement();
        if (entry.isDirectory()) {
            File file = new File(path + entry.getName());
            file.mkdir();
            System.out.println("Create dir " + entry.getName());
        } else {
            File f = new File(entry.getName());
            FileOutputStream fos = new FileOutputStream(f); //EXception occurs here
            InputStream is = zipFile.getInputStream(entry);
            byte[] buffer = new byte[1024];
            int bytesRead = 0;
            while ((bytesRead = is.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
            fos.close();
            System.out.println("Create File " + entry.getName());
        }
    }
}

Это мой вывод:

Exception in thread "main" java.io.FileNotFoundException: Payload/SMA Jobs.app/06-magnifying-glass.png (No such file or directory)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
    at Main.main(Main.java:27)
    enter code here

Кто-нибудь знает, как справиться с этими периодами?

Ответы [ 3 ]

2 голосов
/ 29 января 2011

Прежде всего, вы должны использовать mkdirs (), а не mkdir ().

во-вторых, zip-файлы не всегда содержат все записи каталога (или имеют их в правильном порядке). Лучше всего создавать каталоги в обеих ветвях кода, поэтому добавьте:

    } else {
        File f = new File(entry.getName());
        f.getParent().mkdirs();

(вы должны добавить некоторые проверки, чтобы удостовериться, что getParent () не равен нулю и т. Д.).

0 голосов
/ 11 июня 2014
if (entry.isDirectory()) {
            File file = new File(path + entry.getName());
....
} else {
            File f = new File(entry.getName());
....

При создании каталога передается путь к файлу: path + entry.getName () но при создании файла передается путь к файлу entry.getName ()

После изменения пути к файлу path + entry.getName () код работает для имен файлов периодов и обычных имен файлов. :)

0 голосов
/ 29 января 2011

Я не думаю, что период - это проблема.Посмотрите на абсолютный путь к файлу, который вы пытаетесь вывести, и убедитесь, что он указывает на правильное место.

...