wie Spülen Sie den ZipOutputStream regelmäßig in java
Ich versuche, Archiv Liste von Dateien im zip-format und dann herunterladen Sie es für den Benutzer on-the-fly...
Ich bin mit out of memory Problem, wenn das herunterladen einer zip 1 GB Größe
Bitte helft mir, wie kann ich dies beheben, ohne Erhöhung der jvm-heap-Größe. ich möchte zu Spülen, den Bach in regelmäßigen Abständen..
ICH VERSUCHE IN REGELMÄßIGEN ABSTÄNDEN ZU SPÜLEN, ABER DAS IST NICHT FÜR MICH ARBEITEN.
Bitte meinen code unten angehängt:
try{
ServletOutputStream out = response.getOutputStream();
ZipOutputStream zip = new ZipOutputStream(out);
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition",
"attachment; filename=\"ResultFiles.zip\"");
//adding multiple files to zip
ZipUtility.addFileToZip("c:\\a", "print1.txt", zip);
ZipUtility.addFileToZip("c:\\a", "print2.txt", zip);
ZipUtility.addFileToZip("c:\\a", "print3.txt", zip);
ZipUtility.addFileToZip("c:\\a", "print4.txt", zip);
zip.flush();
zip.close();
out.close();
} catch (ZipException ex) {
System.out.println("zip exception");
} catch (Exception ex) {
System.out.println("exception");
ex.printStackTrace();
}
public class ZipUtility {
static public void addFileToZip(String path, String srcFile,
ZipOutputStream zip) throws Exception {
File file = new File(path + "\\" + srcFile);
boolean exists = file.exists();
if (exists) {
long fileSize = file.length();
int buffersize = (int) fileSize;
byte[] buf = new byte[buffersize];
int len;
FileInputStream fin = new FileInputStream(path + "\\" + srcFile);
zip.putNextEntry(new ZipEntry(srcFile));
int bytesread = 0, bytesBuffered = 0;
while ((bytesread = fin.read(buf)) > -1) {
zip.write(buf, 0, bytesread);
bytesBuffered += bytesread;
if (bytesBuffered > 1024 * 1024) { //flush after 1mb
bytesBuffered = 0;
zip.flush();
}
}
zip.closeEntry();
zip.flush();
fin.close();
}
}
}
}
- gibt es eine Verdichtung in den zipoutputstream? wenn ja, dann kannst du nicht Spülen Sie es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie die aufgeteilte Codierung an eine Datei senden, die großen sonst den servlet-container wird versuchen, herauszufinden, die Größe der Daten, die Sie senden möchten, bevor Sie es, so kann es die Content-Length-header. Da Sie komprimieren Dateien, die Sie nicht wissen, die Größe der Daten, die Sie senden. Chunked-Encoding-ermöglicht es Ihnen, Stücke von der Reaktion in kleinere Stücke. Nicht die Länge des Inhalts der Sendung. Sie könnten versuchen, mithilfe von curl oder etwas zu sehen, die HTTP-Header in der Antwort Ihr immer vom server. Wenn es nicht aufgeteilte dann werden Sie wollen, um das herauszufinden. Sie wollen die Forschung, wie zu zwingen, den servlet-container zu senden, chunked-encoding. Haben Sie vielleicht fügen Sie diese, um die response-header, um den servlet-container senden es chunked.
Die andere option wäre, der zum komprimieren der Datei in eine temporäre Datei.createTemp(), und senden Sie dann den Inhalt der. Wenn Sie zu komprimieren, um eine temporäre Datei, erst dann kann man wissen, wie groß die Datei ist und die content-Länge für das servlet.
Ich denke, Sie Graben in eine falsche Richtung. Versuchen Sie, ersetzen Sie die servlet-stream-Ausgabe von einem Datei-stream und sehen, ob das Problem dann immer noch hier. Ich vermute, Ihr web-container versucht zu sammeln, die gesamte servlet-output zu berechnen, content-length, bevor sendenden http-Header.
Andere Sache...Sie führen die enge im inneren try-catch-block. Dies lässt die chance für den stream geöffnet bleiben, auf Ihre Dateien, wenn Sie eine Ausnahme, so gut wie NICHT zu geben, die stream der chance auf flush auf die Festplatte.
Immer sicherstellen, dass Ihre Nähe ist, in einen finally-block (zumindest, bis Sie von Java 7 mit " try-mit-Ressourcen-block)
Nun, wenn Sie brauchen, um eine Schleife, können Sie einfach eine Schleife um den Teil, den Sie brauchen, um weitere Dateien hinzufügen. Vielleicht übergeben Sie ein array von Dateien und Durchlaufen Sie es. Dieser code hat bei mir das zippen einer Datei.
Nicht die Größe Ihrer
buf
basierend auf der Größe der Datei, verwenden Sie eine Feste Größe Puffer.