2014-09-22 2 views
5

У меня проблема с созданным zip-файлом. Я использую Java 7. Я попытался создать zip-файл из массива байтов, который содержит два или более файла Excel. Приложение всегда заканчивается без каких-либо исключений. Итак, я подумал, что все в порядке. После того как я попытался открыть zip-файл, в Windows 7 появилось сообщение об ошибке, что zip-файл может быть поврежден. Я не мог открыть его, и я понятия не имею, почему ...! Я искал эту проблему, но найденные фрагменты кода выглядят точно так же, как и в моей реализации.Создание zip-файла в памяти из байта []. Zip-файл всегда поврежден

Это мой код:

if (repsList.size() > 1) 
{ 
    String today = DateUtilities.convertDateToString(new Date(), "dd_MM_yyyy"); 
    String prefix = "recs_" + today; 
    String suffix = ".zip"; 
    ByteArrayOutputStream baos = null; 
    ZipOutputStream zos = null; 
    try 
    { 
    baos = new ByteArrayOutputStream(); 
    zos = new ZipOutputStream(baos); 

    for (RepBean rep : repsList) 
    { 
     String filename = rep.getFilename(); 
     ZipEntry entry = new ZipEntry(filename); 
     entry.setSize(rep.getContent().length); 
     zos.putNextEntry(entry); 
     zos.write(rep.getContent()); 
     zos.closeEntry(); 
    } 
    // this is the zip file as byte[] 
    reportContent = baos.toByteArray(); 

    } 
    catch (UnsupportedEncodingException e) 
    { 
    ... 
    } 
    catch (ZipException e) { 
    ... 
    } 
    catch (IOException e) 
    { 
    ... 
    } 
    finally 
    { 
    try 
    { 
     if (zos != null) 
     { 
     zos.close(); 
     } 

     if (baos != null) 
     { 
     baos.close(); 
     } 
    } 
    catch (IOException e) 
    { 
     // Nothing to do ... 
     e.printStackTrace(); 
    } 
    } 
} 
try 
{ 
    response.setContentLength(reportContent.length); 
    response.getOutputStream().write(reportContent); 
} 
catch (IOException e) 
{ 
    ... 
} 
finally 
{ 
    try 
    { 
    response.getOutputStream().flush(); 
    response.getOutputStream().close(); 
    } 
    catch (IOException e) 
    { 
    ... 
    } 
} 

Это должно быть очень простой сбой, но я не могу найти его. Было бы неплохо, если бы вы помогли мне с моей проблемой. Большое спасибо.

ответ

12

Вы преобразовываете ByteArrayOutputStream в byte[], прежде чем вы закрыли ZipOutputStream. Вы должны убедиться, zos закрыта, прежде чем делать baos.toByteArray(), самый простой способ обеспечить это попытка-с ресурсами конструкт:

try 
    { 
    try (baos = new ByteArrayOutputStream(); 
     zos = new ZipOutputStream(baos)) 
    { 
     for (RepBean rep : repsList) 
     { 
     String filename = rep.getFilename(); 
     ZipEntry entry = new ZipEntry(filename); 
     entry.setSize(rep.getContent().length); 
     zos.putNextEntry(entry); 
     zos.write(rep.getContent()); 
     zos.closeEntry(); 
     } 
    } 
    // this is the zip file as byte[] 
    reportContent = baos.toByteArray(); 
    } 
    // catch blocks as before, finally is no longer required as the try-with-resources 
    // will ensure the streams are closed 
+1

Чувак, ты мой герой на сегодняшний день! :-) Это работает, наконец. :-)) – F4k3d

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