wie zum download von großen Dateien ohne Speicherprobleme in java
Wenn ich versuche den download einer großen Datei, die von 260MB vom server, bekomme ich diese Fehlermeldung: java.lang.OutOfMemoryError: Java heap space.
ich bin sicher, dass mein heap-Größe ist weniger als 252MB. Gibt es eine Möglichkeit, ich kann den download großer Dateien ohne Erhöhung der heap-Größe?
Wie kann ich große Dateien herunterladen, ohne dieses Problem? Mein code ist unten angegeben:
String path= "C:/temp.zip";
response.addHeader("Content-Disposition", "attachment; filename=\"test.zip\"");
byte[] buf = new byte[1024];
try {
File file = new File(path);
long length = file.length();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
ServletOutputStream out = response.getOutputStream();
while ((in != null) && ((length = in.read(buf)) != -1)) {
out.write(buf, 0, (int) length);
}
in.close();
out.close();
InformationsquelleAutor der Frage Hima Bindu | 2011-08-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es 2 Orte, wo ich Sie sehen konnte potenziell sein Aufbau Speichernutzung:
#1 ich würde vorschlagen, das Lesen direkt aus der Datei über
FileInputStream
ohne dieBufferedInputStream
. Versuchen Sie das zuerst und sehen, ob es Ihr Problem löst. ie:statt:
Wenn #1 nicht das Problem beheben, könnte man versuchen Sie in regelmäßigen Abständen Spülen Sie den output-stream nach so viel Daten geschrieben werden (Abnahme chunk-Größe, wenn nötig):
ie:
InformationsquelleAutor der Antwort JJ.
Leider haben Sie nicht erwähnt, welche Art
out
ist. Wenn Sie Speicher-Probleme, die ich denke, es istByteArrayOutpoutStream
. So, ersetzen Sie es durchFileOutputStream
und schreiben Sie den byte, die Sie herunterladen, direkt zur Datei.BTW, verwenden Sie nicht
read()
Methode liest eine byte-by-byte. Verwendenread(byte[] arr)
statt. Dies ist viel schneller.InformationsquelleAutor der Antwort AlexR
Ersten Sie können entfernen Sie die (in != null) von deiner while-Anweisung, es ist unnötig. Zweitens, versuchen Sie, den BufferedInputStream und nur:
InformationsquelleAutor der Antwort Triton Man
Es ist nichts falsch (in Bezug auf Speicher) mit dem code, den Sie sind, zeigen. Entweder die servlet-container, der konfiguriert ist zum Puffern des gesamten response (Blick auf die
web.xml
- Konfiguration), oder der Speicher ist durchgesickert anderswo.InformationsquelleAutor der Antwort Michael Borgwardt