Java Unzip - 没有异常,但结果为空

时间:2014-09-11 13:20:39

标签: java stream unzip zipfile

我使用网络上的以下代码

File dir = new File(dest.getAbsolutePath(), archiveName);
    // create output directory if it doesn't exist
    if (!dir.exists()) {
        dir.mkdirs();
    }
    System.err.println(pArchivePath);
ZipFile zipFile = null;
    try {
        zipFile = new ZipFile(pArchivePath);
        Enumeration<?> enu = zipFile.entries();
        while (enu.hasMoreElements()) {
            ZipEntry zipEntry = (ZipEntry) enu.nextElement();

            String name = zipEntry.getName();
            long size = zipEntry.getSize();
            long compressedSize = zipEntry.getCompressedSize();
            System.out.printf("name: %-20s | size: %6d | compressed size: %6d\n", 
                    name, size, compressedSize);

            File file = new File(name);
            if (name.endsWith("/")) {
                System.err.println("make dir " + name);
                file.mkdirs();
                continue;
            }

            File parent = file.getParentFile();
            if (parent != null) {
                parent.mkdirs();
            }

            InputStream is = zipFile.getInputStream(zipEntry);
            FileOutputStream fos = new FileOutputStream(file);
            byte[] bytes = new byte[1024];
            int length;
            while ((length = is.read(bytes)) >= 0) {
                fos.write(bytes, 0, length);
            }
            is.close();
            fos.close();

        }
        zipFile.close();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (zipFile != null) {
            try {
                zipFile.close();
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

解压缩档案。它包含7zip或Winrar作为.zip存档但重命名为.qtz(但我不知道这会导致问题..) 因此,如果我运行代码解压缩我的存档一切正常:我得到sysout / err上的输出列出所有文件,也没有异常发生,但如果我查看目标目录...它是空的 - 只是根文件夹存在。

我也用过

  Runtime.getRuntime().exec(String.format("unzip %s -d %s", pArchivePath, dest.getPath()));

但是我不能再使用它了,因为启动了一个新流程,并且我在java代码中解压缩过程后继续处理存档。

那么问题是..为什么代码的和平不起作用?有很多类似的例子,但没有一个适合我。

br,Philipp

编辑:以下解决了我的问题

File file = new File(dir.getParent(), name);

所以我没有为这个文件设置正确的父路径。

2 个答案:

答案 0 :(得分:0)

我在想,因为我没有看到你做这样的事情:

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipPath+ "Zip.zip"));
out.putNextEntry(new ZipEntry("Results.csv"));

我仍在努力,但我认为这个问题是因为这使得文件在zip内部

你也应该使用ZipOutputStream来写;喜欢

out.write(bytes, 0, length);

答案 1 :(得分:0)

代码中的以下片段:

       File parent = file.getParentFile();
        if (parent != null) {
            parent.mkdirs();
        }

这在哪里创建父目录?因为我尝试了你的代码并且它不在目标目录中创建,而是在我的Eclipse项目目录中创建。查看代码,目标目录无处可用,对吧?

代码实际上提取了zip文件的内容,但没有提到我预期的内容。