首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZipException:打开压缩文件时出错

ZipException:打开压缩文件时出错
EN

Stack Overflow用户
提问于 2013-10-03 13:30:11
回答 1查看 6.7K关注 0票数 1

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

代码语言:javascript
复制
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) 

这是我的密码

代码语言:javascript
复制
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 (“some”)而不是解压缩文件时,它工作得很好。

而且,文件I/O从来都不是我的优点,所以请注意:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-03 14:19:21

好吧,我想这就是问题所在:

代码语言:javascript
复制
ZipInputStream zis = new ZipInputStream(in);
out = new FileOutputStream(entryDestination);
out.write(zis.read());
out.flush();
out.close();

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

代码语言:javascript
复制
byte[] buffer = new byte[8192];
int bytes;
while ((bytes = input.read(buffer)) > 0) {
    output.write(buffer, 0, bytes);
}

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

顺便说一句,退一步想想为什么你没有发现这个问题是值得的。例如,我要做的第一件事就是查看文件被解压缩的目录,然后尝试打开这些文件。只要看到一堆1字节的文件,那就有点不太好了。在试图诊断一个问题时,重要的是你可以把一个大问题分解成小问题,并找出哪个小问题是错误的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19160547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档