2013-10-03 2 views
1

Я работаю над методом, который возьмет застегнутый ZIP-файл, распакует его и вернет новый файл/каталог, содержащий все распакованные файлы. Цель состоит в том, чтобы затем взять этот каталог и извлечь из него документ excel, а затем преобразовать его в класс рабочей книги, который я построил (который полностью протестирован и работает отлично). Проблема заключается в том, что я получаю следующее исключение:ZipException: ошибка при открытии zip-файла

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 = новый файл («some path») вместо использования распакованного файла, он отлично работает.

Кроме того, File I/O никогда не было моей сильной стороной, так что приятно :)

+0

arghh. Вы меня? Это именно то, что я делал несколько дней назад. Ответ ниже от @Jon Skeet разрешает его. – tom

ответ

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

Тем не менее, вы бы лучше использовать 3-ю библиотеку партии, чтобы скрыть все эти детали - посмотреть на Guava и его ByteStreams и Files классы, например.

Стоит сделать шаг назад и решить, почему вы не обнаружили эту проблему для себя, между прочим. Например, первое, что я сделал бы, это посмотреть на каталог, в котором файлы были распакованы, и попытаться открыть эти файлы. Просто увидеть кучу 1-байтных файлов было бы немного дешевой. Когда вы пытаетесь диагностировать проблему, очень важно, чтобы вы могли разделить большую проблему на мелкие и выяснить, какая маленькая ошибка.

+0

Это сделало, большое спасибо! – rearden

Смежные вопросы