2014-09-22 19 views
5

Mam problem z moim utworzonym plikiem zip. Używam Java 7. Próbowałem utworzyć plik zip z tablicy bajtowej, która zawiera dwa lub więcej plików Excel. Aplikacja kończy się bez żadnych wyjątków. Więc myślałem, że wszystko jest w porządku. Po próbie otwarcia pliku zip pojawił się komunikat o błędzie z systemu Windows 7, że plik zip może być uszkodzony. Nie mogłem go otworzyć i nie mam pojęcia, dlaczego ...! Przeszukałem ten problem, ale znalezione fragmenty kodu wyglądają dokładnie tak samo, jak w mojej implementacji.Tworzenie pliku zip w pamięci poza bajtem []. Plik ZIP jest zawsze uszkodzony

To jest mój kod:

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) 
    { 
    ... 
    } 
} 

To musi być bardzo prosty awarii, ale nie mogę go znaleźć. Byłoby miło, gdybyś pomógł mi z moim problemem. Dziękuję bardzo z góry.

Odpowiedz

12

Konwertujesz ByteArrayOutputStream na byte[], zanim zamkniesz model ZipOutputStream. Państwo musi zapewnić zos jest zamknięty, zanim zrobisz baos.toByteArray(), najprostszym sposobem, aby upewnić się, że jest to try-with-zasobów konstrukt:

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

Koleś, jesteś moim bohaterem na dzisiaj! :-) W końcu działa. :-)) – F4k3d