2013-03-13 10 views
11

एंड्रॉइड एप्लिकेशन में मैं Camera Intent से ली गई तस्वीर भेज रहा हूं इसलिए मुझे Bitmap को बाइट सरणी में बदलने की आवश्यकता है। ऐसा करने के लिए मैं इस प्रकार एक ByteArrayOutputStream का उपयोग करें:एंड्रॉइड एप्लिकेशन में बंद ByteArrayOutputStream

private byte[] getRawImageData(Bitmap source) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    byte[] rawImageData = null; 
    try { 
     source.compress(CompressFormat.JPEG, DEFAULT_COMRESSION, baos); 
     rawImageData = baos.toByteArray(); 
    } finally { 
     try { 
      baos.close(); 
     } catch (IOException e) { 
      // handle exception here 
     } 
    } 
    return rawImageData; 
} 

सब कुछ ठीक काम करता है और सभी, असली सवाल जावाडोक और एंड्रॉयड से डॉक के बीच ByteArrayOutputStream के दस्तावेज में अंतर है।

Javadoc पढ़ता

बंद करने पर एक ByteArrayOutputStream कोई प्रभाव नहीं है।

Android doc पढ़ता है:

इस धारा बंद करता है। यह इस स्ट्रीम के लिए उपयोग किए जाने वाले सिस्टम संसाधनों को रिलीज़ करता है।

मैं धारा को बंद कर रहा हूं इससे कोई फर्क नहीं पड़ता कि मैं क्या जानना चाहता हूं कि कौन सा दस्तावेज सही है और वे अलग क्यों हैं।

+2

पहला और दूसरा सही है, आउटपुटस्ट्रेम कार्यान्वयन पर निर्भर करता है, एक बाओस बंद करता है, कुछ भी नहीं करता है। हालांकि, हमेशा धाराओं को बंद करने के लिए यह अच्छा अभ्यास है, इससे कोई फर्क नहीं पड़ता कि वे – epoch

+0

कहां से आते हैं, क्या आप चिंतित हैं कि बाइट सरणी के अंतर्गत धाराओं के साथ क्या होता है, जब 'क्लोज़' कहा जाता है? – Perception

+0

@epoch लेकिन समस्या यह है: ** इस स्ट्रीम को बंद करने की आवश्यकता क्यों है जब यह कुछ भी नहीं करता है?** – waqaslam

उत्तर

8

ByteArrayOutputStream एक स्मृति आधारित स्ट्रीम (कोड में उपयोगकर्ता द्वारा प्रबंधित और पॉप्युलेट) है, इसलिए जब आप close() पर कॉल करते हैं तो इसका कोई प्रभाव नहीं पड़ता है। अपनी मेमोरी पैर-प्रिंट को साफ करने का एकमात्र तरीका इस ऑब्जेक्ट के सभी संदर्भों को रद्द कर रहा है। तब तक, कचरा कलेक्टर जल्द ही भविष्य में किक-इन करेगा और ऐसी वस्तुओं को साफ करने के लिए अपना काम करेगा।

हालांकि, जब आप फ़ाइलों या इनपुट/आउटपुट सॉकेट स्ट्रीम (जैसे OutputStream, InputStream) जैसे संसाधन संलग्न करते हैं, तो स्ट्रीम को बंद करना आवश्यक है। जब आप ऐसी स्ट्रीमों पर close() पर कॉल करते हैं, तो JVM सुरक्षित रूप से अपनी स्थानीय-स्टोरेज/कब्जा-स्मृति रिलीज़ करता है और किसी आउटऑफमेमरी समस्याओं से बचाता है।

तो सामान्य रूप से, यह किसी भी प्रकार की स्ट्रीम पर close() पर कॉल करने के लिए अच्छा (और कभी-कभी महत्वपूर्ण) होता है, लेकिन अधिक महत्वपूर्ण बात यह जानना बेहतर होता है कि हमें क्यों कॉल करना चाहिए।

3

यह ByteArrayOutputStrem.close

के कार्यान्वयन है
public void close() throws IOException { 
} 

एपीआई का कहना है एक ByteArrayOutputStream समापन कोई प्रभाव नहीं है

तो यह करीब(), दूसरी ओर यह नुकसान नहीं पहुंचाता पर छोड़ सुरक्षित है , जेवीएम स्किप वैसे भी रिक्त तरीकों पर कॉल करता है। इसका उपयोग चेतावनियों से बचने के लिए किया जा सकता है संसाधन बंद नहीं है।

0

स्ट्रीम बंद करने से कोई नुकसान नहीं होगा, लेकिन इसे बंद नहीं किया जा सकता है। तो इसे बंद करना बेहतर है।

संबंधित मुद्दे