Basta scrivere in blocchi invece di copiarli interamente nella memoria di Java prima. L'esempio di base sottostante lo scrive in blocchi di 10 KB. In questo modo si finisce con un utilizzo coerente della memoria di soli 10 KB anziché la lunghezza totale del contenuto. Anche l'utente finale inizierà a ottenere parti del contenuto molto prima.
response.setContentLength(getContentLength());
byte[] buffer = new byte[10240];
try (
InputStream input = getInputStream();
OutputStream output = response.getOutputStream();
) {
for (int length = 0; (length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
}
Come creme de la creme per quanto riguarda le prestazioni, è possibile utilizzare NIO Channels
e assegnato direttamente ByteBuffer
. Creare il seguente metodo utility/helper in alcune classi di utilità personalizzate, ad es. Utils
:
public static long stream(InputStream input, OutputStream output) throws IOException {
try (
ReadableByteChannel inputChannel = Channels.newChannel(input);
WritableByteChannel outputChannel = Channels.newChannel(output);
) {
ByteBuffer buffer = ByteBuffer.allocateDirect(10240);
long size = 0;
while (inputChannel.read(buffer) != -1) {
buffer.flip();
size += outputChannel.write(buffer);
buffer.clear();
}
return size;
}
}
che poi utilizzano come di seguito:
response.setContentLength(getContentLength());
Utils.stream(getInputStream(), response.getOutputStream());
Speravo ci potesse essere un altro modo, ma grazie comunque –
Grazie mille BalusC, –
Naturalmente molti pacchetti di utilità hanno già definito questo metodo, quindi una volta iniziato a usare Guava ... http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io /ByteStreams.html#copy(java.io.InputStream, java.io.OutputStream) –