पिछले जवाब गलत नहीं हैं, लेकिन वे गहराई है कि मैं देखना पसंद में नहीं जाते। ऐसे मामले हैं जब निम्न स्तर InputStream
से निपटने के लिए केवल वांछनीय नहीं है, लेकिन आवश्यक है, सबसे आम उदाहरण स्रोत (कुछ वेब सर्वर) से गंतव्य (डेटाबेस) तक एक बड़ी फ़ाइल स्ट्रीम कर रहा है। यदि आप ByteArrayInputStream
का उपयोग करने का प्रयास करते हैं, तो आप आश्चर्यजनक रूप से नहीं होंगे, OutOfMemoryError
के साथ बधाई दी। हां, आप अपना खुद का HTTP क्लाइंट कोड रोल कर सकते हैं, लेकिन आपको ग़लत प्रतिक्रिया कोड, प्रतिक्रिया कन्वर्टर्स इत्यादि से निपटना होगा। यदि आप पहले ही स्प्रिंग का उपयोग कर रहे हैं, तो RestTemplate
एक प्राकृतिक विकल्प है।
इस लेखन के रूप में, spring-web:5.0.2.RELEASE
एक ResourceHttpMessageConverter
एक boolean supportsReadStreaming
है, जो अगर सेट है कि है, और प्रतिक्रिया प्रकार InputStreamResource
है, रिटर्न InputStreamResource
; अन्यथा यह ByteArrayResource
देता है। तो स्पष्ट रूप से, आप एकमात्र ऐसा नहीं हैं जो समर्थन स्ट्रीमिंग के लिए कहा जाता है।
हालांकि, एक समस्या है: RestTemplate
HttpMessageConverter
रनों के तुरंत बाद प्रतिक्रिया को बंद कर देता है। इस प्रकार, भले ही आपने InputStreamResource
के लिए पूछा, और इसे प्राप्त किया, यह अच्छा नहीं है, क्योंकि प्रतिक्रिया स्ट्रीम बंद कर दी गई है। मुझे लगता है कि यह एक डिजाइन दोष है जिसे उन्होंने अनदेखा किया; यह प्रतिक्रिया प्रकार पर निर्भर होना चाहिए था। तो दुर्भाग्यवश, पढ़ने के लिए, आपको पूरी तरह से प्रतिक्रिया का उपभोग करना होगा; RestTemplate
का उपयोग करते समय आप इसे पास नहीं कर सकते हैं।
लेखन हालांकि कोई समस्या नहीं है। यदि आप InputStream
स्ट्रीम करना चाहते हैं, तो ResourceHttpMessageConverter
आपके लिए यह करेगा। हुड के तहत, से OutputStream
पर 4096 बाइट लिखने के लिए org.springframework.util.StreamUtils
का उपयोग करता है।
HttpMessageConverter
कुछ मीडिया प्रकारों का समर्थन करते हैं, इसलिए आपकी आवश्यकता के आधार पर, आपको डिफ़ॉल्ट लोगों को RestTemplate
से हटा देना पड़ सकता है, और जिन्हें आप चाहते हैं उन्हें सेट करें, उनके रिश्तेदार आदेश के प्रति सावधान रहें।
इतना ही नहीं बल्कि, ClientHttpRequestFactory
के कार्यान्वयन एक boolean bufferRequestBody
है कि आप कर सकते हैं, और चाहिए, false
करने के लिए सेट करता है, तो आप एक बड़ी धारा अपलोड कर रहे हैं। अन्यथा, आप जानते हैं, OutOfMemoryError
। इस लेखन के अनुसार, SimpleClientHttpRequestFactory
(जेडीके क्लाइंट) और HttpComponentsClientHttpRequestFactory
(अपाचे HTTP क्लाइंट) इस सुविधा का समर्थन करते हैं, लेकिन OkHttp3ClientHttpRequestFactory
नहीं। फिर, डिजाइन निरीक्षण।
'responseEntity.getBody()। GetInputStream(); 'गलत है। कोई getInputStream विधि नहीं है। –
@ ब्रेनस्टॉर्म, पुराने संस्करण और वसंत-कोर-3.1.1.RELEASE' से नए संस्करणों में एक ['org.springframework.core.io.Resource'] है (https://docs.spring.io/spring/docs/ वर्तमान/javadoc-api/org/springframework/core/io/Resource.html) जो 'org.springframework.core.io.InputStreamSource' को बढ़ाता है जो' getInputStream() ' – Abdull