2010-07-12 10 views
11

मैं एक जावा विधि बना रहा हूं जो एक तर्क के रूप में एक InputStream स्वीकार करता है। एक अक्षर आधारित धारा के साथ काम करने की सुविधा के लिए, मैं विधि कार्यान्वयन के शुरू में प्रदान की InputStream लपेट इस प्रकार है:मैं अपनी विधि में पास इनपुट इनपुट को बंद करने से कैसे बचूं जो मैं रीडर स्ट्रीम में लपेटता हूं?

public void doStuff(InputStream inStream) { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(inStream)); 
    ... 
} 

InputStream (inStream) के बाद से मेरी विधि को पारित कर दिया है, मुझे नहीं पता इसे बंद करना चाहते हैं ... जैसा कि मुझे लगता है कि मेरी विधि को कॉल करने वाले क्लाइंट की ज़िम्मेदारी होनी चाहिए (क्या यह धारणा सही है?)। हालांकि, मुझे लगता है कि मुझे बनाया गया BufferedReader बंद करना चाहिए; लेकिन ऐसा करने में, मेरा मानना ​​है कि यह inStream समेत अन्य सभी रचनाकृत धाराओं को स्वचालित रूप से बंद कर देगा।

क्या कोई मुझे BufferedReader और InputStreamReader को बंद करने का कोई तरीका देखता है जिसे मैंने InputStream को मेरे तरीके से पास नहीं किया है, जबकि मैंने बनाया है? शायद इसे लपेटने से पहले प्रदान किए गए InputStream की एक प्रति बनाने का कोई तरीका है? धन्यवाद

+1

आप जानते हैं कि अनचाहे स्ट्रीम बहुत बेकार होगी? –

+1

आपको इसे अनदेखा करने और प्लेटफ़ॉर्म डिफ़ॉल्ट को उपयोग करने के बजाय 'इनपुटस्ट्रीम रीडर' बनाने के दौरान एक विशिष्ट 'वर्णसेट' की आपूर्ति करनी चाहिए। – ColinD

+0

टॉम, क्या आप स्पष्ट करेंगे कि "अनचाहे स्ट्रीम" से आपका क्या मतलब है? – user389591

उत्तर

3

मैं क्या कोशिश करता हूँ close विधि अधिभावी किया जाएगा:

BufferedReader reader = new BufferedReader(new InputStreamReader(inStream)){ 
    public void close() throws IOException { 
     synchronized (lock) { 
      if (in == null) 
       return; 
     } 
    } 
}; 
// rest of your code 

पागल की तरह है, लेकिन यह काम करना चाहिए। हालांकि, मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है।

मुझे लगता है कि यह एक दिलचस्प सवाल है, इसलिए मुझे उम्मीद है कि कोई विशेषज्ञ अपनी राय देता है।

4

निजी तौर पर मैं सिर्फ आवश्यक है कि एक BufferedReader (या रीडर) में पारित किया जाना अपने विधि के हस्ताक्षर बदलकर समस्या से बचने होगा।

+0

यह कॉलर को BufferedReader के निर्माण का प्रचार करता है। लेकिन क्या होगा अगर कॉलिंग विधि कहीं और से अपनी स्ट्रीम प्राप्त करे? –

+1

आप एक अच्छा बिंदु है: कोई भी 'रीडर' आधारित संस्करण भी प्रदान करना चाहता है। क्योंकि, अगर किसी को गैर-डिफ़ॉल्ट एन्कोडिंग के साथ 'इनपुटस्ट्रीम' मिलता है, तो वह स्ट्रीम आधारित विधि का उपयोग नहीं कर सकती है, क्योंकि इनपुटस्ट्रीम रीडर गलत एन्कोडिंग का उपयोग करता है। –

+0

'java.util.Properties' वर्ग 'लोड (इनपुटस्ट्रीम इनस्ट्रीम)' और 'लोड (रीडर रीडर)' विधियों दोनों प्रदान करता है। मुझे लगता है कि आपकी कक्षा के संभावित ग्राहकों के लिए उपलब्ध दोनों विकल्प एक सुविधा है जो क्लाइंट कोड को सरल बना सकता है। यही है, क्लाइंट को 'रीडर' प्राप्त करने के लिए विधि को तर्क के रूप में पास करने से पहले 'इनपुटस्ट्रीम' को लपेटना नहीं है। – user389591

9

आप एक BufferedReader या InputStreamReader या शायद सबसे पाठक कार्यान्वयन को बंद करने की जरूरत नहीं है , जब आप अंतर्निहित पाठक को बंद नहीं करना चाहते हैं।

इन पाठकों में कोई संसाधन नहीं है जो close() पर कॉल मुक्त कर देगा और कचरा कलेक्टर वैसे भी मुक्त नहीं करेगा (उदाहरण के लिए देशी चर या स्थिर चर में मूल्य) जब आप अंत में पाठक के संदर्भ को छोड़ देते हैं आपकी विधि का

मूल संसाधनों के साथ संवाद करने वाली अंतर्निहित इनपुट स्ट्रीम, उदा। FileInputStream या यूआरएल से प्राप्त धाराओं को उन मूल संसाधनों को मुक्त करने के लिए बंद होना चाहिए।

Writer के लिए, close() में एक अंतर है आमतौर पर flush() पर कॉल करता है। लेकिन फिर, आप सीधे flush() पर कॉल कर सकते हैं।

+1

हां, हालांकि कुछ संपीड़न धाराएं (हालांकि 'पाठकों' तक जहां तक ​​मुझे पता है) मूल संसाधनों का उपयोग नहीं करते हैं और उन्हें बंद करने की आवश्यकता होती है। वास्तव में –

+0

। तो जब आप कई आउटपुट स्ट्रीमों को जोड़ना चाहते थे, प्रत्येक एक स्वयं को संकुचित करता है, एक आउटपुट स्ट्रीम में, एक विकल्प करीबी विधि को ओवरराइड करना है क्योंकि @ क्रिस्टियन सी सुझाव देता है। (कुछ ऐसा ही होता है जब संकुचित अभिलेखागार का उपयोग करते समय कई फाइलें होती हैं।) –

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