Öncelikle tamamen Java'nın belleğine kopyalamak yerine blok halinde yazınız. Aşağıdaki temel örnek, 10 KB'lik bloklara yazar. Bu sayede, tam içerik uzunluğu yerine sadece 10 KB tutarlı bir bellek kullanımıyla sonuçlanırsınız. Ayrıca, son kullanıcı, içeriğin bir kısmını daha çabuk almaya başlayacaktır. performans açısından
creme de la creme olarak
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);
}
}
, sen MİT
Channels
kullanabilir ve bir doğrudan
ByteBuffer
ayırdı. Bazı özel yardımcı program sınıflarında aşağıdaki yardımcı programı/yardımcı yöntemi oluşturun, ör.
Utils
: o zaman aşağıdaki gibi kullanmak
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;
}
}
:
response.setContentLength(getContentLength());
Utils.stream(getInputStream(), response.getOutputStream());
Başka bir yol olabileceğini umuyordum, ama yine de teşekkürler –
Teşekkürler BalusC, –
Tabii ki birçok yardımcı program, bu yöntemi zaten tanımlıyor, bu yüzden Guava'yı kullanmaya başladığınızda ... http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io /ByteStreams.html#copy(java.io.InputStream, java.io.OutputStream) –