ZipException:打开zip文件时出错

我正在处理一个方法,将采取一个压缩文件,解压缩,并返回一个新的文件/目录包含所有解压缩的文件。 目标是,然后采取该目录,并从中提取一个Excel文档,然后将其转换成我build立的工作簿类(这是完全unit testing,工作正常)。 问题是我得到以下exception:

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

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

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

好的,我现在认为这是问题所在:

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

您正在创build一个新文件,并写入一个字节 。 这不会是一个有效的任何描述的Excel文件。 你也没有使用finally块closuresstream,但这是另一回事。 要将一个stream的内容复制到另一个stream,需要如下所示的内容:

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

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

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