2017-01-05 5 views
0

Warum könnte der folgende Code eine beschädigte ZIP-Datei generieren, wenn sie über einen Servlet-Ausgabestream ausgegeben wird? Wenn Sie die ZIP-Datei mit einem FileOutputStream lokal auf dem Datenträger schreiben, scheint der Ausgabestream nicht beschädigt zu sein.JAVA - Beschädigte ZIP-Datei mit ZipOutptuStream mit FileInputStream

// Create zip stream 
ZipOutputStream zos = new ZipOutputStream(this.servletOutputStream); 

// prepare a new entry 
ZipEntry zipEntry = new ZipEntry(forZip.getName()); 
zipEntry.setSize(forZip.getTotalSpace()); 
zipEntry.setTime(System.currentTimeMillis()); 

// write entry 
zos.putNextEntry(zipEntry); 

// write the file to the entry 
FileInputStream toBeZippedInputStream = new FileInputStream(forZip); 
IOUtils.copy(toBeZippedInputStream, zos); 
zos.flush(); 

// close entry 
zos.closeEntry(); 

// close the zip 
zos.finish(); 
zos.close(); 

this.servletOutputStream.flush(); 

this.servletOutputStream.close(); 

// close output stream 
IOUtils.closeQuietly(toBeZippedInputStream); 

Ist das vielleicht ein Problem mit der Reihenfolge der Flushing/Closing-Streams?

+0

Sie möchten den 'toBeZippedInputStream' anstelle der' zos' spülen? – LostKatana

+0

Wie stellen Sie fest, dass Stream-Daten beschädigt sind? –

+0

Wie können Sie sicher sein, dass das Problem nicht in dem Code enthalten ist, den Sie nicht angezeigt haben? Wenn dieser Code fehlerhaft ist, sollte es nicht zu schwierig sein, einen [mcve] vorzubereiten und zu präsentieren. –

Antwort

0

Versuchen Sie, den Reißverschluss zu schließen, bevor Sie die Zip-Stream Spülung

// close entry 
zos.closeEntry(); 

zos.flush(); 

Auf dem Codierungsstil, verwenden try-with-resources die Ressourcen, um sicherzustellen, ordnungsgemäß geschlossen sind.

Verwandte Themen