2013-07-05 6 views
14

मैं पर पढ़ने किया गया है InputStream, FileInputStream, ByteArrayInputStream और कैसे उनके उपयोग काफी स्पष्ट (आउटपुट स्ट्रीम भी) लगता है की तुलना में।जावा: FilterInputStream फायदे और उपयोग क्या कर रहे हैं अन्य धाराओं

  • यह अन्य धारा वर्गों की तुलना में उपयोग करने का लाभ क्या है:

    मैं क्या कर रहा हूँ संघर्ष FilterInputStream & FilterOutputStream के उपयोग को समझने के लिए है?

  • मैं इसे जब इस्तेमाल करना चाहिए?
  • कृपया एक सैद्धांतिक स्पष्टीकरण और एक मूल उदाहरण प्रदान करें। के बाद से अपने निर्माता protected है

उत्तर

18

FilterInputStream, the Decorator pattern.

इस वर्ग बढ़ाया जाना चाहिए का एक उदाहरण है। व्युत्पन्न कक्षा अतिरिक्त क्षमताओं को जोड़ती है, लेकिन फिर भी InputStream के मूल इंटरफ़ेस का पर्दाफाश करती है।

उदाहरण के लिए, एक BufferedInputStream तेजी से डेटा पढ़ने में बनाने के लिए एक अंतर्निहित इनपुट स्ट्रीम के बफरिंग प्रदान करता है, और एक DigestInputStream डेटा की एक क्रिप्टोग्राफिक हैश की गणना के रूप में यह उपयोग की गई।

आप मौजूदा कोड में कार्यक्षमता जोड़ने के लिए इसका उपयोग करेंगे जो InputStream या OutputStream API पर निर्भर करता है। उदाहरण के लिए, मान लें कि आप कुछ लाइब्रेरी का उपयोग करते हैं जो डेटा को OutputStream पर सहेजता है। डेटा बहुत बड़ा बढ़ रहा है, इसलिए आप संपीड़न जोड़ना चाहते हैं। डेटा दृढ़ता लाइब्रेरी को संशोधित करने के बजाय, आप अपने एप्लिकेशन को संशोधित कर सकते हैं ताकि वह स्ट्रीम को "सजाने" दे जो वर्तमान में ZipOutputStream के साथ बनाता है। पुस्तकालय धारा का उपयोग करेगा जैसे कि पुराने संस्करण का उपयोग किया गया था जिसमें संपीड़न की कमी थी।

+0

ठीक है, लेकिन BufferedInputStream और DigestInputStream वास्तव में अंतर्निहित धारा के साथ कुछ करना। क्या FilterInputStream क्या करता है? – ed22

3

जब आप डेटा की स्ट्रीम को सजाना चाहते हैं तो आप उनका उपयोग करते हैं।

याद रखें कि ये स्ट्रीम क्लास इंस्टेंस स्वयं को किसी अन्य स्ट्रीम इंस्टेंस के आसपास लपेटते हैं (चाहे इनमें से किसी एक का सबक्लास या नहीं) और कुछ फीचर जोड़ें, कुछ प्रोसेसिंग जोड़ें, डेटा में कुछ बदलाव करें जैसे यह गुजरता है।

उदाहरण के लिए, आप कुछ स्ट्रीम से सभी एकाधिक रिक्त स्थान को हटाना चाहेंगे। आप फ़िल्टरइनपुटस्ट्रीम का अपना सबक्लास बनाते हैं और read() विधि को ओवरराइड करते हैं। मैं सभी विवरण परेशान करने के लिए उपवर्ग में विधि के लिए नहीं जा रहा हूँ, लेकिन यहाँ है कुछ sorta-जावा:

private boolean lastWasBlank = false; 
public int read() { 
    int chr = super.read(); 
    if (chr == ' ') { 
     if (lastWasBlank) { 
      return read(); 
     } else { 
      lastWasBlank = true; 
     } 
    } else { 
     lastWasBlank = false; 
    } 
    return chr; 
} 

वास्तविक जीवन में, क्या तुम करोगी शायद अन्य दो read() भी तरीकों के साथ गड़बड़।

अन्य उपयोग:

  • लॉग सब कुछ धारा
  • माध्यम से बह रही 'टी' उपयोगिता डुप्लिकेट धारा पढ़ा जा रहा दो तरीके नियंत्रित किया जाता है।
  • विंडोज, मैक और यूनिक्स/लिनक्स प्रारूप
  • के बीच लाइन अंतराल को कनवर्ट करें मॉडेम या सीरियल पोर्ट या वायरलेस नेटवर्क कनेक्शन जैसे धीमी संचरण विधियों को अनुकरण करने में देरी जोड़ें।
+0

FilterInputStream मदद करने के लिए एक धारा है कि डेटा फिल्टर लागू कुछ भी नहीं है और सही ढंग से 'mark', का समर्थन करता है' available', आदि आप एक आधार वर्ग है कि वास्तव में मदद मिलेगी एक InputStream डेकोरेटर लागू की जानते हो? –

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