स्कैनर बनाम बफ़रडर


284

जहाँ तक मुझे पता है, दो जावा में एक फ़ाइल से चरित्र आधारित डाटा पढ़ने का सबसे आम तरीकों का उपयोग कर रहा है Scannerया BufferedReader। मुझे यह भी पता है कि BufferedReaderभौतिक डिस्क संचालन से बचने के लिए एक बफर का उपयोग करके फ़ाइलों को कुशलतापूर्वक पढ़ता है।

मेरे प्रश्न हैं:

  • Scannerसाथ ही प्रदर्शन करता है BufferedReader?
  • क्यों आप किसे चुनेंगे Scannerसे अधिक BufferedReaderया विपरीत उपाध्यक्ष?

1
मैं आम तौर पर मानक ('स्कैनर इन = नया स्कैनर (System.in)' को बहुत अधिक साफ-सुथरा महसूस करता हूं। यकीन नहीं होता है कि वास्तव में कम कुशल है, लेकिन जब से एसटीडी से पढ़ना अवरुद्ध है, मैं कल्पना नहीं कर सकता कि स्कैनर की दक्षता मुद्दा होगी।
dimo414

जवाबों:


201

Scannerधारा की सामग्री से टोकन को पार्स करने के लिए उपयोग किया जाता है, जबकि BufferedReaderसिर्फ धारा पढ़ता है और कोई विशेष पार्सिंग नहीं करता है।

वास्तव में आप पार्स करने के लिए पात्रों के स्रोत के रूप में BufferedReaderएक पास कर सकते हैं scanner


55
बफ़रड्रेडर सिंक्रनाइज़ है और स्कैनर नहीं है, इसलिए इसका फैसला करने के लिए आप पर निर्भर है।
रूबेन

1
मुझे पता है कि यह विषय पुराना है, लेकिन प्रक्रिया द्वारा प्रदान की गई धाराओं (यानी एक बाहरी कमांड के आउटपुट को कैप्चर करना) से सामग्री को खुरचने की कोशिश करने पर बफ़रडर का उपयोग करके ऑपरेटिंग सिस्टम के बीच मिश्रित परिणाम मिले हैं। एक बार जब मैंने स्कैनर का उपयोग करने के लिए अपना कोड बदल दिया, तो जैसा कि एक अलग उत्तर में उल्लेख किया गया था , चीजों ने लगातार और उम्मीद के मुताबिक व्यवहार करना शुरू कर दिया।
EWH

@Reuben लेकिन Scannerअंततः इसके इनपुट के लिए कुछ और पर निर्भर करता है, जिसे अच्छी तरह से सिंक्रनाइज़ किया जा सकता है।
लोर्ने

189

वर्तमान में नवीनतम JDK6 रिलीज़ / बिल्ड (b27) में ( 8192 वर्णों ) के विपरीत Scannerएक छोटा बफर ( 1024 वर्ण ) है, लेकिन यह पर्याप्त से अधिक है।BufferedReader

पसंद के अनुसार, Scannerयदि आप फ़ाइल को पार्स करना चाहते हैं, BufferedReaderतो उपयोग करें यदि आप फ़ाइल लाइन को लाइन से पढ़ना चाहते हैं । साथ ही उनके द्वारा तैयार एपीआई दस्तावेज़ों के परिचयात्मक पाठ को देखें।

  • पार्स करना = दिए गए इनपुट को टोकन (भागों) के रूप में व्याख्या करना। यह आपको विशिष्ट भागों को सीधे इंट, स्ट्रिंग, दशमलव आदि के रूप में वापस देने में सक्षम है, कक्षा nextXxx()में उन सभी तरीकों को भी देखें Scanner
  • पढ़ना = गूंगा करना। यह आपको सभी पात्रों को वापस देता रहता है, जिन्हें आप बदले में मैन्युअल रूप से निरीक्षण करना चाहते हैं यदि आप कुछ उपयोगी मिलान या रचना करना चाहते हैं। लेकिन अगर आपको ऐसा करने की आवश्यकता नहीं है, तो पढ़ना पर्याप्त है।

1
अच्छा है। बफर टिप के लिए धन्यवाद। यह सब के लिए देख रहा था के रूप में देशी रीड बेहद महंगे हैं।
बजे

7
@ आसिफ: पार्सिंग = दिए गए इनपुट को टोकन (भागों) के रूप में व्याख्या करना। यह आपको विशिष्ट भागों को सीधे इंट, स्ट्रिंग, दशमलव, आदि के रूप में वापस देने में सक्षम है। स्कैनर वर्ग में उन सभी अगली एक्सएक्सएक्स () विधियों को भी देखें। पढ़ना = गूंगा करना। यह आपको सभी पात्रों को वापस देता रहता है, जिन्हें आप बदले में मैन्युअल रूप से निरीक्षण करना चाहते हैं यदि आप कुछ उपयोगी मिलान या रचना करना चाहते हैं। लेकिन अगर आपको ऐसा करने की आवश्यकता नहीं है, तो पढ़ना पर्याप्त है।
बालुस

@ बाल्सक ठीक है मैं पहले से ही इस्तेमाल किया, readInt();रीडफ़्लोट (); आदि अब मिल गया है जो पार्सिंग का मतलब है। और BalusC आप मुझे चैट रूम में सिर्फ 10 मिनट के लिए थोड़ा समय दे सकते हैं, मैं बफर के बारे में थोड़ा पूछना चाहता हूं कि यह कैसे काम करता है।
आसिफ मुश्ताक

मैं BufferedReaderस्कैनर के निर्माता में क्या लपेट सकता हूं ? यह एक अच्छा विचार है?
विवेक

1
Scannerपैटर्न मिलान के लिए आवश्यकतानुसार बफर का विस्तार किया जाएगा। इसलिए यदि आप एक बड़ा बफर चाहते हैं, तो आपको केवल आह्वान करने की जरूरत है, उदाहरण के लिए findWithinHorizon("\\z", 8192), उस पर और बाद में, यह एक बफर का उपयोग करेगा जिसमें क्षमता 8192(या पूरी फाइल अगर यह उससे छोटी है)।
होल्गर

77

इस लिंक को देखें , निम्नलिखित को वहां से उद्धृत किया गया है:

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

BufferedReader को सिंक्रनाइज़ किया जाता है, इसलिए BufferedReader पर संचालन को सुरक्षित रूप से कई थ्रेड से किया जा सकता है।

दूसरी ओर एक स्कैनर में बहुत अधिक पनीर बनाया गया है; यह वह सब कर सकता है जो एक बफ़रडियर कर सकता है और दक्षता के समान स्तर पर भी कर सकता है। हालांकि, इसके अलावा एक स्कैनर नियमित अभिव्यक्ति का उपयोग करके आदिम प्रकारों और तारों के लिए अंतर्निहित धारा को पार्स कर सकता है। यह आपकी पसंद के परिसीमन के साथ अंतर्निहित स्ट्रीम को भी टोकन कर सकता है। यह सीमांत की अवहेलना करने वाली अंतर्निहित धारा की स्कैनिंग भी कर सकता है!

एक स्कैनर हालांकि थ्रेड सेफ नहीं है, इसे बाहरी रूप से सिंक्रोनाइज़ करना होगा।

यदि आप एक साधारण लॉग रीडर लिख रहे हैं, तो बफ़रडियर या स्कैनर का उपयोग करने का विकल्प आपके द्वारा लिखे गए कोड पर निर्भर करता है। हालाँकि यदि आप XML पार्सर स्कैनर लिख रहे हैं तो अधिक प्राकृतिक विकल्प है।

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


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

40
  1. BufferedReaderस्कैनर की तुलना में काफी बड़ी बफर मेमोरी है। का प्रयोग करें BufferedReaderआप एक धारा से लंबे तार, और उपयोग प्राप्त करना चाहते हैं, तो Scannerअगर आप एक धारा से टोकन के विशिष्ट प्रकार पार्स करने के लिए चाहता हूँ।

  2. Scannerकस्टम सीमांकक का उपयोग करके टोकन का उपयोग कर सकते हैं और स्ट्रीम को आदिम प्रकार के डेटा में पार्स BufferedReaderकर सकते हैं , जबकि केवल स्ट्रिंग को पढ़ और संग्रहीत कर सकते हैं।

  3. BufferedReaderजबकि समकालिक Scannerनहीं है। BufferedReaderयदि आप कई थ्रेड्स के साथ काम कर रहे हैं तो उपयोग करें ।

  4. ScannerIOException छुपाता है जबकि BufferedReaderइसे तुरंत फेंकता है।


18

मैं BufferedReaderपाठ पढ़ने के लिए उपयोग करने का सुझाव देता हूं । Scannerखाल IOException, जबकि BufferedReaderइसे तुरंत फेंकता है।


12

बफ़रडर और स्कैनर के बीच अंतर निम्नलिखित हैं:

  1. बफ़रड्रेडर सिंक्रनाइज़ किया गया है, लेकिन स्कैनर सिंक्रनाइज़ नहीं है
  2. बफ़रडेडर थ्रेड सुरक्षित है लेकिन स्कैनर थ्रेड सुरक्षित नहीं है
  3. बफ़रड्रेडर में बड़ी बफर मेमोरी होती है लेकिन स्कैनर में छोटी बफर मेमोरी होती है
  4. बफ़रडाइडर तेज़ है लेकिन स्कैनर निष्पादन में धीमा है
  5. कंसोल से एक लाइन पढ़ने के लिए कोड:

    बफरर :

     InputStreamReader isr=new InputStreamReader(System.in);
     BufferedReader br= new BufferedReader(isr);
     String st= br.readLine();

    स्कैनर :

    Scanner sc= new Scanner(System.in);
    String st= sc.nextLine();

8

बफ़रड्रेडर और स्कैनर के बीच अंतर हैं

  1. बफ़रड्रेडर केवल डेटा पढ़ता है, लेकिन स्कैनर डेटा को पार्स भी करता है।
  2. आप केवल बफर का उपयोग करके स्ट्रिंग पढ़ सकते हैं, लेकिन आप स्कैनर का उपयोग करके int, long या float पढ़ सकते हैं।
  3. बफरर स्कैनर से पुराना है, यह jdk 1.1 से मौजूद है जबकि स्कैनर को JDK 5 रिलीज़ पर जोड़ा गया था।
  4. 1KB स्कैनर की तुलना में BufferReader का बफर आकार बड़ा (8KB) ​​है।
  5. बफर स्ट्रिंग के साथ फ़ाइल पढ़ने के लिए बफ़रडर अधिक उपयुक्त है जबकि कमांड प्रॉम्प्ट से छोटे उपयोगकर्ता इनपुट को पढ़ने के लिए स्कैनर अधिक उपयुक्त है।
  6. बफ़रड्रेडर सिंक्रनाइज़ किया गया है, लेकिन स्कैनर ऐसा नहीं है, जिसका अर्थ है कि आप कई थ्रेड्स के बीच स्कैनर साझा नहीं कर सकते।
  7. बफरर स्कैनर की तुलना में तेज़ है क्योंकि यह पार्सिंग पर समय नहीं बिताता है
  8. स्कैनर की तुलना में बफ़रडेडर थोड़ा तेज़ है
  9. BufferedReader java.io पैकेज से है और स्कैनर java.util पैकेज से उन बिंदुओं के आधार पर है जो हम अपनी पसंद का चयन कर सकते हैं।

धन्यवाद


6

मुख्य अंतर:

  1. चित्रान्वीक्षक

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

उदाहरण

 String input = "1 fish 2 fish red fish blue fish";
 Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
 System.out.println(s.nextInt());
 System.out.println(s.nextInt());
 System.out.println(s.next());
 System.out.println(s.next());
 s.close(); 

निम्नलिखित आउटपुट प्रिंट करता है:

 1
 2
 red
 blue 

इस कोड के साथ एक ही आउटपुट उत्पन्न किया जा सकता है, जो एक बार में सभी चार टोकन पार्स करने के लिए एक नियमित अभिव्यक्ति का उपयोग करता है:

 String input = "1 fish 2 fish red fish blue fish";

 Scanner s = new Scanner(input);
 s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
 MatchResult result = s.match();
 for (int i=1; i<=result.groupCount(); i++)
     System.out.println(result.group(i));
 s.close(); `


  1. BufferedReader:

    • एक चरित्र-इनपुट स्ट्रीम से पाठ पढ़ता है, वर्णों को बफ़र करता है ताकि वर्णों, सरणियों और रेखाओं के कुशल पढ़ने के लिए प्रदान किया जा सके।

    • बफर आकार निर्दिष्ट किया जा सकता है, या डिफ़ॉल्ट आकार का उपयोग किया जा सकता है। अधिकांश उद्देश्यों के लिए डिफ़ॉल्ट काफी बड़ा है।

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

BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));

निर्दिष्ट फ़ाइल से इनपुट को बफ़र करेगा। बफरिंग के बिना, रीड () या रीडलाइन () के प्रत्येक इनवोकेशन से बाइट्स को फ़ाइल से पढ़ा जा सकता है, वर्णों में परिवर्तित किया जा सकता है, और फिर वापस लौटाया जा सकता है, जो बहुत अक्षम हो सकता है। प्रोग्राम जो पाठ इनपुट के लिए DataInputStreams का उपयोग करते हैं, उन्हें प्रत्येक DataInputStream को एक उपयुक्त बफ़रडर के साथ बदलकर स्थानीयकृत किया जा सकता है।

स्रोत: लिंक


3

जावा में इनपुट लेने के विभिन्न तरीके हैं:

1) बफ़रडर 2) स्कैनर 3) कमांड लाइन तर्क

BufferedReader एक चरित्र-इनपुट स्ट्रीम से पाठ पढ़ें, वर्णों, सरणियों और लाइनों के कुशल पढ़ने के लिए प्रदान करने के लिए पात्रों को बफर करना।

जहां स्कैनर एक साधारण टेक्स्ट स्कैनर है जो नियमित भावों का उपयोग करके आदिम प्रकारों और तारों को पार्स कर सकता है।

यदि आप एक साधारण लॉग रीडर लिख रहे हैं तो बफ़र्ड रीडर पर्याप्त है। यदि आप एक XML पार्सर स्कैनर लिख रहे हैं तो अधिक प्राकृतिक विकल्प है।

अधिक जानकारी के लिए कृपया देखें:

http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69


1

नीचे उत्तर कंसोल से पढ़ने से लिया गया है : जावा स्कैनर बनाम बफ़रडर

कंसोल से इनपुट पढ़ते समय, इसे प्राप्त करने के लिए दो विकल्प मौजूद हैं। पहला प्रयोग Scanner, दूसरा प्रयोग BufferedReader। दोनों की अलग-अलग विशेषताएं हैं। इसका मतलब है कि मतभेद इसका उपयोग कैसे करें।

स्कैनर ने दिए गए इनपुट को टोकन के रूप में माना। BufferedReader सिर्फ स्ट्रिंग के रूप में दिए गए लाइन द्वारा लाइन को पढ़ता है। स्केनर इट सेल्फ पार्सिंग क्षमताएं प्रदान करता है, जैसे नेक्स्ट (), नेक्स्ट फ्लोट ()।

लेकिन, दूसरों के बीच अंतर क्या है?

  • स्कैनर ने दिए गए इनपुट को टोकन के रूप में माना। बफर लाइन स्ट्रीमर / स्ट्रिंग के रूप में
  • स्कैनर ने रेगेक्स का उपयोग करके दिए गए इनपुट को टोकन दिया। BufferedReader का उपयोग करके अतिरिक्त कोड लिखना होगा
  • बफर * स्कैनर की तुलना में तेजी से बफ़र। 2
  • स्कैनर सिंक्रनाइज़ नहीं है, बफ़रड्रेडर सिंक्रनाइज़ है

स्कैनर जेडीके संस्करण 1.5 उच्चतर के साथ आता है।

स्कैनर, या बफर रीडर का उपयोग कब करना चाहिए?

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


0
  1. बफ़रडेडर शायद आपको बेहतर प्रदर्शन देगा (क्योंकि स्कैनर InputStreamReader पर आधारित है, स्रोत देखें)। अप, फ़ाइलों से पढ़ने के लिए यह nio का उपयोग करता है। जब मैंने बड़ी फ़ाइलों के लिए बफ़रडियर प्रदर्शन के खिलाफ nio प्रदर्शन का परीक्षण किया तो nio थोड़ा बेहतर प्रदर्शन दिखाता है।
  2. फ़ाइल से पढ़ने के लिए Apache Commons IO आज़माएं।

0

मैं पसंद Scannerकरता हूं क्योंकि यह जाँच किए गए अपवादों को नहीं फेंकता है और इसलिए यह अधिक सुव्यवस्थित कोड में उपयोग के परिणाम है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.