Chỉ cần viết các khối thay vì sao chép toàn bộ khối vào bộ nhớ của Java trước tiên. Ví dụ cơ bản dưới đây viết nó trong các khối 10KB. Bằng cách này, bạn kết thúc với việc sử dụng bộ nhớ nhất quán chỉ có 10KB thay vì độ dài nội dung hoàn chỉnh. Ngoài ra, người dùng cuối sẽ bắt đầu nhận được các phần của nội dung sớm hơn nhiều.
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);
}
}
Như creme de la Creme liên quan đến hiệu suất với, bạn có thể sử dụng nio Channels
và trực tiếp phân bổ ByteBuffer
. Tạo phương thức tiện ích/trình trợ giúp sau trong một số lớp tiện ích tùy chỉnh, ví dụ: 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;
}
}
Mà bạn sau đó sử dụng như sau:
response.setContentLength(getContentLength());
Utils.stream(getInputStream(), response.getOutputStream());
Tôi đã hy vọng có thể có một cách khác, nhưng cảm ơn anyway –
Cảm ơn rất nhiều BalusC, –
Tất nhiên nhiều gói tiện ích có phương pháp này đã được xác định, vì vậy khi bạn bắt đầu sử dụng Guava ... http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io /ByteStreams.html#copy(java.io.InputStream, java.io.OutputStream) –