2012-01-17 14 views
6

मुझे एक आरईएसटी सेवा में छवियों और छोटी वीडियो फ़ाइलों (लगभग 5 एमबी, 10 एमबी से कम) भेजने की जरूरत है, जो मैं लिखूंगा। मुझे आश्चर्य है कि मुझे इस कार्य को पूरा करने के लिए बाइट [] या स्ट्रीम का उपयोग करना चाहिए या नहीं। बाइट [] और स्ट्रीम का उपयोग करने के बीच स्थानांतरण फ़ाइल आकार के संदर्भ में विभाजित लाइन क्या होगी?बाइट सरणी का उपयोग कब करें, और स्ट्रीम का उपयोग कब करें?

उत्तर

9

लेन-देन में जो निःशुल्क मेमोरी आप प्रतिबद्ध करने के इच्छुक हैं, वह आपकी वास्तविक बाधा है।

यदि आपके पास 5 एम फ़ाइल है, तो आपको पूरी चीज़ को रैम में लोड करने की आवश्यकता होगी, जिसकी लागत 5 एम होगी।

यदि आप इसे स्ट्रीम करते हैं, तो आप फ़ाइल से छोटे भाग को पुन: प्रयोज्य बफर में पढ़कर और उन हिस्सों को HTTP स्ट्रीम में लिखकर बहुत कम स्मृति का उपयोग कर सकते हैं।

5

आखिरकार, आप किसी भी तरह से स्ट्रीम भेज रहे हैं।

यदि आपको byte[] के रूप में आपके नियंत्रण के बाहर किसी अन्य स्रोत से डेटा प्राप्त हुआ है, तो आप इसे अपने प्रसंस्करण के लिए उस रूप में भी रख सकते हैं जब तक कि यह आपके लिए असुविधाजनक न हो, और उसे नेटवर्क स्ट्रीम में धकेल दिया जाए रेखा।

यदि आप इसे स्ट्रीम के रूप में प्राप्त करते हैं, तो इसे किसी अन्य स्ट्रीम पर धक्का देने के लिए इसे byte[] में बदलने की कोई बात नहीं है। 4 या 8 केआईबी के बफर का उपयोग करें (4 से 8 के बजाय 4 या 8, क्योंकि उन लोगों की पूरी संख्या-मेमोरी-पेज संयोग में कुछ मामूली फायदे हैं जिनके साथ आप लाभ भी ले सकते हैं)।

यदि आप इसे स्वयं बना रहे हैं, तो अधिकांश मामलों के लिए स्ट्रीम दोनों आसान है (बाइनरी या टेक्स्ट लेखक में लपेटें, और इसके माध्यम से काम करें) साथ ही साथ अधिक कुशल।

अधिक आम तौर पर, यदि मुझे 8kiB से अधिक का बफर दिखाई देता है जिसे स्ट्रीम से लिखा या पढ़ा जा रहा है, तो मैं ध्यान दूंगा कि चीजों को बहुत धीमा होने पर बदलने की कोशिश करने वाली पहली चीज़ के रूप में।

0

बाइट सरणी या स्ट्रीम के बीच चयन करते समय सामान्य परीक्षण इस बात पर निर्भर करता है कि क्या आप जानते हैं, सामने, कितने बाइट डेटा में हैं, और यदि यह संख्या किसी दिए गए उद्देश्य के लिए एक उचित रूप से छोटा है।

उदाहरण के लिए, यदि आप स्थानीय मशीन पर उपलब्ध एक छोटी आइकन फ़ाइल (50 केबी से कम) से निपट रहे हैं और आप फाइलसाइज जानते हैं, तो बाइट सरणी के साथ जाएं।

इसके विपरीत, यदि आप मूवी फ़ाइल के साथ काम कर रहे हैं, तो यह मुश्किल होगा, अनावश्यक का उल्लेख न करें, एक बार में 2 जीबी सामग्री को स्मृति में रखने के लिए, स्ट्रीम का उपयोग करें।

स्ट्रीम डेटा या डेटा के बड़े सेट को संभालने के लिए सबसे अच्छे हैं जिनकी लंबाई सामने नहीं है।