java.util.zip在文件名/目录名中有句点问题吗?

时间:2011-01-29 13:30:33

标签: java zip

我要解压缩iPhone应用.ipa文件。 这实际上是正常提取的zip文件。 但其中的实际app文件是一个带有.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 个答案:

答案 0 :(得分:2)

首先,你应该使用mkdirs(),而不是mkdir()。

第二,zip文件并不总是包含所有目录条目(或者以正确的顺序使用它们)。最好的做法是在代码的两个分支中创建目录,所以添加:

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

(你应该添加一些检查以确保getParent()不为空等)。

答案 1 :(得分:0)

我不认为这个时期是个问题。查看您尝试输出的文件的绝对路径,并确保它指向正确的位置。

答案 2 :(得分:0)

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()后,代码适用于期间文件名和普通文件名。 :)