ZipException:打开zip文件时出错

时间:2013-10-03 13:30:11

标签: java excel io unzip

我正在开发一个方法,它将获取一个压缩文件,解压缩它,然后返回一个包含所有解压缩文件的新文件/目录。目标是然后获取该目录并从中提取excel文档,然后将其转换为我构建的Workbook类(完全经过单元测试并且工作正常)。问题是我遇到以下异常:

java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:215)
at java.util.zip.ZipFile.<init>(ZipFile.java:145)
at java.util.zip.ZipFile.<init>(ZipFile.java:159)
at com.atd.core.datamigrator.BulkImageUpload.createWorkbook(BulkImageUpload.java:54)
at com.atd.core.datamigrator.BulkImageUpload.importImages(BulkImageUpload.java:38)
at com.atd.core.datamigrator.BulkImageUpload.main(BulkImageUpload.java:236) 

这是我的代码

private Workbook createWorkbook(File file) {
    File unZipedFile = unZip(file);
    File[] files = unZipedFile.listFiles();
    Workbook wBook = null;

    for (int i = 0; i < files.length; i++) {
        if (files[i].getName().contains(".xls")) {
            try {
                File f = files[i];
                ZipFile zip = new ZipFile(f);
                wBook = new Workbook(zip);
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
        }
    }
    return wBook;
}

private File unZip(File input) {
    File output = new File("unzippedFile");
    OutputStream out = null;
    try {
        ZipFile zipFile = new ZipFile(input);
        Enumeration<? extends ZipEntry> entries = zipFile.entries();
        while (entries.hasMoreElements()) {
            ZipEntry entry = entries.nextElement();
            File entryDestination = new File(output, entry.getName());
            entryDestination.getParentFile().mkdirs();
            InputStream in = zipFile.getInputStream(entry);
            ZipInputStream zis = new ZipInputStream(in);
            out = new FileOutputStream(entryDestination);
            out.write(zis.read());
            out.flush();
            out.close();
        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return output;
}

我知道这是解压缩方法的问题,因为当我使用File f = new File(“some path”)而不是使用解压缩文件时,它工作正常。

此外,文件I / O从来都不是我的强项,所以要好看:)

1 个答案:

答案 0 :(得分:2)

好的,我现在相信这就是问题所在:

ZipInputStream zis = new ZipInputStream(in);
out = new FileOutputStream(entryDestination);
out.write(zis.read());
out.flush();
out.close();

您正在创建一个新文件,并向其中写入单字节。这不会是任何描述的有效Excel文件。您也无法使用finally块关闭流,但这是另一回事。要将一个流的内容复制到另一个流,您需要以下内容:

byte[] buffer = new byte[8192];
int bytes;
while ((bytes = input.read(buffer)) > 0) {
    output.write(buffer, 0, bytes);
}

也就是说,您最好使用第三方库来隐藏所有这些细节 - 例如,请查看Guava及其ByteStreamsFiles类。

顺便说一下,你可以退一步找出为什么你没有为自己发现这个问题。例如,我要做的第一件事就是查看文件解压缩的目录,并尝试打开这些文件。只是看到一堆1字节的文件将是一个赠品。在尝试诊断问题时,将一个大问题分解成小问题并确定哪个小问题有问题是至关重要的。