2011-09-11 11 views
29

जावा के BufferedReader और InputStreamReader कक्षाओं के बीच क्या अंतर है?जावा के बुफर्ड रीडर और इनपुटस्ट्रीम रीडर कक्षाओं के बीच क्या अंतर है?

+0

डेटा इनपुटपुट स्ट्रीम क्लास –

+2

@ amod0017 पर भी बताएं, सवाल जवाडोक में पूरी तरह उत्तर दिया गया है। उत्पाद दस्तावेजों में अच्छी तरह से निर्दिष्ट उत्तरों वाले मंचों पर प्रश्न पूछना बहुत बुरी आदत के रूप में निराश होना है। यह सिर्फ मूल्यवान समय बर्बाद करता है। सही उत्तर पहले से ही जावाडोक में है और यहां कोई भी प्रतिक्रिया या तो इसे क्रियात्मक रूप से उद्धृत करेगी, जिसे ओपी पहले ही पढ़ सकता था, या फिर इसे पैराफ्रेश करें जो मूल्य और सटीकता का नुकसान है। और एक प्रश्न पूछना कि आप एक फोरम पर खुद को जवाब दे सकते हैं, और संभावित रूप से गलत जवाब के लिए संभवतः हमेशा के लिए प्रतीक्षा कर सकते हैं। एक तर्कसंगत सीखने की रणनीति नहीं है। – EJP

+2

@EJB मैं आपसे सहमत हूं लेकिन मुझे लगता है कि पूछा गया सवाल गलत तरीके से प्रस्तुत किया गया है ... उसके पास कुछ वेब एप्लिकेशन पर कुछ विशेष इनपुट है और वह सिर्फ यह पूछना चाहता है कि उसे कौन पसंद करना चाहिए ... क्योंकि वह उलझन में है दोनों के बीच ... बस इतना आसान है। – amod

उत्तर

32

BufferedReader "इनपुटस्ट्रीम रीडर/फ़ाइल रीडर" दोनों के लिए एक रैपर है, जो प्रत्येक बार मूल I/O कहलाता है, जो जानकारी को बफर करता है।

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

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

उम्मीद है कि यह मदद करता है।

+0

@ajay ... मुझे बताएं कि अधिक जानकारी आवश्यक है .. लेकिन संदेह के लिए निर्दिष्ट करें। – amod

+1

amod मैं इन वर्गों का उपयोग किसी वेबपृष्ठ की सामग्री को संग्रहीत करने के लिए करना चाहता हूं .मैं जानना चाहता हूं कि मुझे BufferedReader या InputStreamReader का उपयोग करना चाहिए? –

+0

@ajay मुझे इस बारे में ज्यादा यकीन नहीं है .. लेकिन मैंने कहीं पढ़ा है कि बफररडर कुशल है। – amod

16

InputStreamReader वर्ग adapts Reader वर्ग (कुछ वर्ण सेट में वर्ण समझ बाइट्स) को InputStream (uninterpreted बाइट्स) टाइप करें, लेकिन किसी भी अतिरिक्त बफरिंग लागू नहीं होता। BufferedReader कक्षा Reader कक्षा (संभावित रूप से अप्रयुक्त) लेती है और इसमें बफरिंग लागू होती है।

+2

"बफरिंग" इसका क्या अर्थ है? –

+6

बफरिंग का अर्थ है कि डेटा को "बफर" नामक सरणी में समेकित किया जाता है।एक बफर का उपयोग अधिक कुशलता से पढ़ता है कि आप नेटवर्क से बड़े हिस्सों को एक समय में बफर में कॉपी करते हैं, भले ही आप केवल एक समय में बफर से थोड़ी सी मात्रा पढ़ लें। यह सामग्री को फिर से पढ़ना संभव बनाता है जो पहले से ही खाया गया है (बफर में पहले की स्थिति में वापस जाकर जो "निशान"/"रीसेट" करता है)। –

+0

बाइट द्वारा 'read() 'byte का उपयोग कब करें और बाइट के' read (byte []) 'सरणी का उपयोग कब करें। जैसा कि मुझे लगता है कि रीडिंग सरणी हमेशा बेहतर होती है। तो क्या आप मुझे उदाहरण दे सकते हैं कि उनमें से एक का उपयोग कैसे करें? – UnKnown

12

मुख्य मेमोरी से पढ़ना डिस्क/एसटीडीआईएन से पढ़ने से तेज़ है।

BufferedReader एक तकनीक हमें कितनी बार हम मुख्य स्मृति में हिस्सा कॉपी करके डिस्क/STDIN से पढ़ने को कम करने की अनुमति देता है कि कहा जाता है बफरिंग उपयोग करता है।

पर विचार करें:

BufferedReader in = new InputStreamReader(System.in); 
in.read(); // 
in.read(); // 
// ... 
in.read(); // could be hitting the disk/STDIN a lot (slow!) 

बनाम:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
in.read(); // 
in.read(); // 
// ... 
in.read(); // hitting main memory a lot (fast!) 

documentation से:

बफरिंग बिना

, प्रत्येक मंगलाचरण read() की का कारण बन सकता बाइट्स [डिस्क से पढ़ने के लिए/STDIN], वर्णों में परिवर्तित, और फिर लौटा, जो बहुत अक्षम हो सकता है।

दो वर्ग Reader के समान इंटरफ़ेस को लागू करते हैं। तो जब आप BufferedReader के बिना उपयोग कर सकते हैं, तो इसका परिणाम खराब प्रदर्शन हो सकता है। हम सिर्फ decorator pattern का उपयोग कर रहे हैं ताकि हम InputStreamReader के साथ समाप्त हो जाएं जो में अब एक बफरिंग क्षमता है।

0

मैं समझता हूँ के रूप में है कि InputStreamReader BufferedReader के बजाय कम समय बाइट्स से डेटा कन्वर्ट करने के लिए character.so को हम

2

BufferedReader एक में निर्दिष्ट धारा से अक्षर और यह भंडार के एक जोड़े पढ़ता बेहतर प्रदर्शन के लिए BufferedReader पसंद करते हैं लेता है बफर। यह इनपुट तेजी से बनाता है।

इनपुटस्ट्रीम रीडर निर्दिष्ट स्ट्रीम से केवल एक वर्ण पढ़ता है और शेष वर्ण अभी भी स्ट्रीम में रहते हैं।

उदाहरण:

class NewClass{  
    public static void main(String args[]) throws IOException{ 

     BufferedReader isr = new BufferedReader(new InputStreamReader(System.in)); 

     Scanner sc = new Scanner(System.in); 

     System.out.println("B.R. - "+(char)isr.read()); 
     System.out.println("Scanner - " + sc.nextLine());  
    } 
} 

जब isr.read() बयान निष्पादित किया जाता है, मैं इनपुट "हैलो" और "हैलो" स्क्रीन पर छपा है चरित्र "h" में प्रवेश किया। यदि यह इनपुटस्ट्रीम रीडर था तो शेष वर्ण "ello" System.in स्ट्रीम में बने रहे होंगे और sc.nextLine() ने उन्हें मुद्रित किया होगा। लेकिन इस मामले में ऐसा नहीं होता है क्योंकि BufferedReader System.in स्ट्रीम से सभी "हैलो" वर्ण पढ़ता है और उन्हें अपने स्वयं के व्यक्तिगत बफर में संग्रहीत करता है और इस प्रकार system.in स्ट्रीम खाली रहता है जब sc.nextLine() है मार डाला।

कोड के लिए:

class NewClass{  

    public static void main(String args[]) throws IOException{ 

     InputStreamReader isr = new InputStreamReader(System.in); 

     Scanner sc = new Scanner(System.in); 

     System.out.println("I.S.R. - "+(char)isr.read()); 
     System.out.println("Scanner - " + sc.nextLine()); 

    } 
} 

इस मामले InputStreamReader "हैलो" इनपुट और शेष "एलो" अभी भी System.in धारा में रहते हैं और इन पात्रों अनुसूचित जाति द्वारा मुद्रित कर रहे हैं के लिए केवल एक ही चरित्र पढ़ता है। nextLine();

निष्कर्ष:

BufferedReader पात्रों में से एक जोड़े को इनपुट स्ट्रीम और उन्हें स्टोर एक बफर में से (भले ही हम केवल एक चरित्र यह है कि अधिक से अधिक पढ़ा जाएगा चाहते हैं) पढ़ता है। यही कारण है कि इसे बुफर्ड रीडर कहा जाता है। मैं यह समझने में असमर्थ था कि यह एक बार में कितने पात्र पढ़ता है। जब मैंने इस जवाब के लिए इसका परीक्षण किया तो यह 3 से 10 तक भिन्न था।

इनपुटस्ट्रीम रीडर इनपुट स्ट्रीम से केवल एक वर्ण पढ़ता है और शेष वर्ण अभी भी स्ट्रीम में रहते हैं। इस मामले में कोई मध्यवर्ती बफर नहीं है।

जब एक या अधिक थ्रेड या ऑब्जेक्ट System.in से अक्षर पढ़ना चाहते हैं तो उस स्थिति में इनपुटस्ट्रीम रीडर का उपयोग किया जाना चाहिए क्योंकि यह केवल एक वर्ण पढ़ता है और शेष अन्य ऑब्जेक्ट्स या थ्रेड्स द्वारा उपयोग किया जा सकता है।

BufferedReader तेज़ है क्योंकि यह एक बफर को बनाए रखता है और डिस्क/stdin से डेटा पुनर्प्राप्त करने की तुलना में बफर से डेटा पुनर्प्राप्त करना हमेशा तेज़ होता है।

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