बस इसे पूरी तरह से जावा की स्मृति में कॉपी करने के बजाय ब्लॉक में लिखें। नीचे मूल उदाहरण इसे 10 केबी के ब्लॉक में लिखता है। इस तरह आप पूरी सामग्री लंबाई के बजाय केवल 10 केबी के लगातार स्मृति उपयोग के साथ समाप्त होते हैं। इसके अलावा एंडुसर सामग्री के कुछ हिस्सों को जल्द से जल्द शुरू कर देगा।
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);
}
}
creme de la creme के रूप में प्रदर्शन के संबंध में, आप NIO Channels
इस्तेमाल कर सकते हैं और एक सीधे ByteBuffer
आवंटित। कुछ कस्टम उपयोगिता वर्ग में निम्न उपयोगिता/सहायक विधि बनाएं, उदा। 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;
}
}
जो तुम तो नीचे के रूप में उपयोग करें: मैं, बाइट [] के उपयोग से बचने के लिए वान
response.setContentLength(getContentLength());
Utils.stream(getInputStream(), response.getOutputStream());
मुझे उम्मीद थी कि एक और तरीका हो सकता है, लेकिन फिर भी –
धन्यवाद बहुत कुछ धन्यवाद BalusC, –
बेशक कई उपयोगिता पैकेजों में यह विधि पहले ही परिभाषित है, इसलिए एक बार जब आप गुवा का उपयोग करना शुरू कर देते हैं ... http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io /ByteStreams.html#copy(java.io.InputStream, java.io.OutputStream) –