2017-06-20 7 views
0

Ich erstelle eine Zip-Datei mit ByteArrayOutputStream und ZipOutPutSteam Aber seine Einnahme viel Verzögerung für eine große Zip-Datei in der Nähe von etwa 200 MB zu erstellen. Gibt es einen effizienten Weg?Herunterladen Zip-Datei von ZipOutputStream mit JAX-RS-

 URL u = new URL(url); 
     URLConnection uc = u.openConnection(); 

     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     ZipOutputStream zipOut = new ZipOutputStream(out); 
     zipOut.putNextEntry(new ZipEntry("file.csv")); 
     zipOut.write(IOUtils.toByteArray(uc.getInputStream())); 
     uc.getInputStream().close(); 
     zipOut.closeEntry(); 
     zipOut.close(); 

     ResponseBuilder response = Response.ok(out.toByteArray()); 
     response.header("Content-Disposition", "attachment; 
     filename=\"LMPeriod.zip\""); 
     return response.build(); 
+0

Sie können versuchen, mit der Komprimierungsstufe herumzuspielen. Sie können die Dateien vorkomprimieren. I.e. habe einen Job, der die Komprimierung im Hintergrund ausführt. Sie können die gezippten Dateien zwischenspeichern. Die Komprimierung selbst dauert immer noch etwa 2 Mikrosekunden für 1 kB Daten + Lesen von Daten aus dem Dateisystem. Mit Ihrer Lösung (Lesen der gesamten Datei in den Speicher und Komprimieren im Speicher) können Speicherprobleme auftreten, wenn mehr als eine gleichzeitige Download-Anforderung vorliegt. – andih

Antwort

0

einen Outputstream statt ByteArrayOutputStream Verwenden Sie die Zip auf die Festplatte zu schreiben. ByteArrayOutputStream speichert das komprimierte Ergebnis im Speicher zwischen. Wenn Sie es auf die Festplatte geschrieben haben möchten, müssen Sie den ZipOutputStream um einen FileOutputStream wickeln.

+0

Und wie löst dies das Problem, dass das Zippen einer Datei zu lange dauert? Das Schreiben der Datei auf Platte ist normalerweise mindestens um einen Faktor 20 langsamer als der Speicherzugriff (Speicher 1 Mikrosekunde, Platten-SSD 16 Mikrosekunden, Komprimierung 1 KB ungefähr 2 Mikrosekunden). – andih

Verwandte Themen