1

我正在研究一种将压缩文件解压缩并返回包含所有解压缩文件的新文件/目录的方法。目标是然后获取该目录并从中提取一个 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;
}

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

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

4

1 回答 1

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);
}

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

顺便说一句,值得退后一步,弄清楚为什么你没有自己发现这个问题。例如,我要做的第一件事是查看解压缩文件的目录,然后尝试打开这些文件。仅仅看到一堆 1 字节的文件就有点令人费解了。在尝试诊断问题时,至关重要的是,您可以将一个大问题分解为小问题,并找出哪个小问题有问题。

于 2013-10-03T14:19:21.240 回答