2011-11-23 8 views
21

मैं जानना चाहता हूं कि mark() और reset()BufferedReader के तरीके क्या हैं? उन्हें इस्तेमाल कैसे करूं? मैंने जावाडोक पढ़ा लेकिन शुरुआत के रूप में मैं इसे समझने में असमर्थ था।BufferedReader में चिह्न और रीसेट क्या हैं?

उत्तर

1

रीडर इंटरफ़ेस आपको वापस जाने देता है, आप बस पढ़ सकते हैं। दूसरी ओर, BufferedReader, एक बफर बनाता है, तो आप पढ़ने के दौरान थोड़ा सा वापस करने में सक्षम हैं। और यही वह तरीका है जिसके लिए वे हैं।

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

1

कल्पना कीजिए कि आप में BufferReader = "123456789" निम्न वर्ण हो, यदि आप में '5' चार को स्थिति 4 रिश्तेदार निशान तो अपने BufferReader रीसेट आप 12345

+1

यह आधा जवाब है, और क्या रीसेट है? – eeerahul

+0

अरे ने एक उचित उत्तर दिया। रीसेट केवल पॉइंटर लाता है, जो चरित्र को पढ़ने के लिए इंगित कर रहा है, जिस स्थिति पर इसे चिह्नित किया गया है। –

13

mark साथ खत्म हो जाएगा और reset धाराओं के तरीके स्ट्रीम में पीछे की तरफ कूदने और डेटा को फिर से पढ़ने का एक तरीका प्रदान करते हैं।

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

mark पर int पैरामीटर इसे अधिकतम वर्णों (BufferedReader) या बाइट्स (BufferedInputStream के लिए) बताता है कि आप पीछे की ओर जाने में सक्षम होना चाहते हैं। यदि आप चिह्नित स्थिति से अधिक डेटा पढ़ते हैं, तो चिह्न "अमान्य" हो सकता है, और reset() पर कॉल अप अपवाद के साथ विफल हो जाएगा।

एक छोटी सी उदाहरण:

BufferedReader r = new BufferedReader(new StringReader(
    "Happy Birthday to You!\n" + 
    "Happy Birthday, dear " + System.getProperty("user.name") + "!")); 
r.mark(1000); // save the data we are about to read 
System.out.println(r.readLine()); // read the first line 
r.reset(); // jump back to the marked position 
r.mark(1000); // start saving the data again 
System.out.println(r.readLine()); // read the first line again 
System.out.println(r.readLine()); // read the second line 
r.reset(); // jump back to the marked position 
System.out.println(r.readLine()); // read the first line one final time 

कि उदाहरण में, मैं readLine() विधि पाने के लिए एक BufferedReader में StringReader लिपटे, लेकिन StringReader s पहले से ही mark और reset अपने दम पर समर्थन करते हैं! में पढ़ने वाले स्ट्रीम डेटा स्रोत आमतौर पर mark और reset का समर्थन करते हैं, क्योंकि उनके पास पहले से ही सभी डेटा मेमोरी है, इसलिए उनके लिए इसे फिर से पढ़ना आसान है। फ़ाइलों या पाइप या नेटवर्क सॉकेट से पढ़ने वाले स्ट्रीम स्वाभाविक रूप से mark और reset का समर्थन नहीं करते हैं, लेकिन आप इसे BufferedInputStream या BufferedReader में लपेटकर किसी भी स्ट्रीम में हमेशा उस सुविधा को जोड़ सकते हैं।

+0

और चिह्न() में इसके पैरामीटर के बारे में क्या है? – UnKnown

+0

@UnKnown मैंने जवाब – Boann

8

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

इस documentation:

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

+0

का विस्तार किया है, क्या आप बस शुरुआत को चिह्नित करने के लिए इसका उपयोग कर सकते हैं और बफर को फिर से पढ़ने के लिए शुरुआत में वापस जा सकते हैं? उदाहरण के लिए यदि आप दो बार फाइल पढ़ना चाहते हैं। एक बार संदर्भ प्राप्त करने के लिए, शुरुआत में वापस जाएं, फिर फिर से पढ़ें? – anon58192932

+0

और इसके पैरामीटर के बारे में क्या है? – UnKnown

6

Reader::mark(int readLimit) प्रलेखन कहते हैं:

इस रीडर में एक निशान स्थिति सेट करता है। पैरामीटर readLimit इंगित करता है कि चिह्न अमान्य से पहले कितने वर्ण पढ़े जा सकते हैं। कॉलिंग रीसेट() रीडरलिमिट को पार नहीं किया गया है, तो पाठक को चिह्नित स्थिति पर वापस स्थानांतरित कर देगा।

उदाहरण:

import java.io.*; 
import static java.lang.System.out; 

public class App { 

    public static final String LINE = "Line 1\nLine 2\nLine 3\nLine 4\n"; 

    public static void main(String[] args) { 

     try (BufferedReader in = new BufferedReader(new StringReader(LINE))) { 

      // first check if this Reader support mark operation 
      if (in.markSupported()) { 

       out.println(in.readLine()); 
       in.mark(0);      // mark 'Line 2' 
       out.println(in.readLine()); 
       out.println(in.readLine()); 
       in.reset();      // reset 'Line 2' 
       out.println(in.readLine()); 
       in.reset();      // reset 'Line 2' 
       out.println(in.readLine()); 
       in.mark(0);      // mark 'Line 3' 
       out.println(in.readLine()); 
       in.reset();      // reset 'Line 3' 
       out.println(in.readLine()); 
       out.println(in.readLine()); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

आउटपुट:

Line 1 
Line 2 
Line 3 
Line 2 
Line 2 
Line 3 
Line 3 
Line 4 
+0

आप 'रीसेट()' कैसे कॉल कर सकते हैं? मैंने सोचा कि यदि आप 0 की रीड सीमा के साथ चिह्नित() 'चिह्नित करते हैं, जैसे ही एक वर्ण पढ़ा जाता है तो मार्कर अमान्य हो जाता है और रीसेट को कॉल करना असंभव है। क्या आप अपना जवाब समझा सकते हैं? – snooze92

+0

@ snooze92 बस इस उदाहरण को चलाने के लिए और 'mark' विधि में 'markLimit' तर्क को बदलने का प्रयास करें। आपके पास हर समय एक ही परिणाम होगा। इसी तरह के उदाहरण भी देखें: [1] (http://goo.gl/KxU1Fy), [2] (http://goo.gl/S2R3qd)। मैं वास्तव में SO पर सवाल करना चाहता था कि किसी ने मुझे इसके बारे में स्पष्टीकरण दिया। –

+2

अपने स्वयं के अधिक उदाहरण चलाने के बाद, मैं 'निशान (readAheadLimit) '/' रीसेट()' तंत्र को थोड़ा बेहतर समझता हूं। असल में, 'मार्क' विधि ** ** वर्तमान बफर ** में बस एक बिंदु चिह्नित करती है, और' रीसेट 'आपको उस चिह्नित बिंदु पर वापस जाने देता है। बात यह है कि, यह किसी फ़ाइल या स्ट्रीम में किसी बिंदु को चिह्नित करने के लिए नहीं है, क्योंकि इसे चिह्नित बिंदु तक पहुंचने की संभावना रखने के लिए बफर आकार को बढ़ाने की आवश्यकता है। यही कारण है कि * * को उस सीमा का उपयोग करना चाहिए जो बफर आकार से अपेक्षाकृत छोटा हो। – snooze92