Hallo zusammen,
ich habe mir nun ein Applet gebastelt, dass mir Dateien mittels einer URL-Connection auf einen Server lädt. Um die Dateien letztendlich auf dem Server zu speichern, nutze ich den OutputStream mit der Methode "write". Da ganze funktioniert auch wunderbar, jedoch wird bei jedem Schleifendurchlauf, und somit mit jedem Outputstream.write(...) immer mehr Arbeitsspeicher belegt. Bei einer 60 MB Datei sind das ganze dann sagenhafte 170 MB in meinem RAM.
Hier ein paar Hintergrundinformationen:
- Das Applet liegt auf einem Projektserver und wird mit einer HTML-Seite ausgeführt.
- Ich habe bereits die maximale Speicherausnutzung von der JVM komplett ausgereizt (256MB).
- Es soll mit dem Applet möglich sein, Dateien mit bis zu 1GB Größe auf den Server zu laden.
Ich habe unten das Coding beigefügt. Hat von Euch jemand eine Idee, wieso der Speicherverbrauch so hoch ist. Mache ich da vielleicht was falsch?
ich habe mir nun ein Applet gebastelt, dass mir Dateien mittels einer URL-Connection auf einen Server lädt. Um die Dateien letztendlich auf dem Server zu speichern, nutze ich den OutputStream mit der Methode "write". Da ganze funktioniert auch wunderbar, jedoch wird bei jedem Schleifendurchlauf, und somit mit jedem Outputstream.write(...) immer mehr Arbeitsspeicher belegt. Bei einer 60 MB Datei sind das ganze dann sagenhafte 170 MB in meinem RAM.
Hier ein paar Hintergrundinformationen:
- Das Applet liegt auf einem Projektserver und wird mit einer HTML-Seite ausgeführt.
- Ich habe bereits die maximale Speicherausnutzung von der JVM komplett ausgereizt (256MB).
- Es soll mit dem Applet möglich sein, Dateien mit bis zu 1GB Größe auf den Server zu laden.
Ich habe unten das Coding beigefügt. Hat von Euch jemand eine Idee, wieso der Speicherverbrauch so hoch ist. Mache ich da vielleicht was falsch?
Code:
// create url object
URL toUrl = new java.net.URL(strPathTo);
// create url-connection and connect to defined url
URLConnection toConn = toUrl.openConnection();
// set doInput and doOutput to TRUE, because we will use the url-
// connection for input and output data - set also the
// RequestProperty
toConn.setDoInput(true);
toConn.setDoOutput(true);
toConn.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + strBoundary);
// calculate the total data upload size
intTotalSize = strMessages[0].getBytes().length
+ strMessages[1].getBytes().length + intDiskFileSize;
toConn.setRequestProperty("Content-Length", "" + intTotalSize);
System.out.println("Multipart-POST: total size of request = "
+ intTotalSize);
osDataOutputStream = toConn.getOutputStream();
// start to write the data
System.out.println("Multipart-POST: message 1 =\r\n"
+ strMessages[0]);
osDataOutputStream.write(strMessages[0].getBytes());
// set Parameters for Process-Bar
jprbrProgressBar.setMinimum(0);
jprbrProgressBar.setMaximum(intTotalSize);
// start to write the file-data
System.out.println("Start to write... with msg2... packetsize = " + intPacketSize);
while ((intOnePacket = fisFileInputStream.read(bytBuffer, 0, intPacketSize)) >= 0) {
// write data
osDataOutputStream.write(bytBuffer, 0, intOnePacket);
// calculate total file size, which was uploaded
intTotalFileSize += intOnePacket;
// update process bar
jprbrProgressBar.setValue(intTotalFileSize);
// "security"-safe - second save command
osDataOutputStream.flush();
// Test to split!
}
// last progress-bar update
jprbrProgressBar.setValue(intTotalSize);
// set status text (bottom of info-popup)
jlblFinishing.setText("Completion - Please Wait!");
// write last message, save (twice) and close stream
System.out.println("Multipart-POST: message 2 =\r\n"
+ strMessages[1]);
osDataOutputStream.write(strMessages[1].getBytes());
osDataOutputStream.flush();
System.out.println("Close streams...(flushed after each package)");
osDataOutputStream.flush();
strMsgs = new String[] { "The Content Server reports an error. ",
"Contact your System Administrator.", "", };
System.out.println("Close outputstream....");
osDataOutputStream.close();