2012-12-18 22 views
6

मैं कार्यक्षमता नहीं मिल सकता है जावा (या ग्रूवी) में निम्न कोड लिखने के लिएएकाधिक अंक

reader.mark(); //(1) 
reader.read(); //reads 'a' 
reader.mark(); //(2) 
reader.read(); //reads 'b' 
reader.reset(); //back to (2) 
reader.read(); //reads 'b' 
reader.reset(); //back to (1) 
reader.read(); //reads 'a' 
reader.read(); //reads 'b' 

Reader.mark(int) एक अच्छा तरीका है, लेकिन यह निशान ढेर doen't, यह केवल रखती है सबसे हालिया एक ..

जावा लाइब्रेरी से कोई समर्थन या मैं स्वयं हूं?

+0

मेरा मानना ​​है कि 'मार्क' आंतरिक रूप से डेटा कैशिंग शुरू करता है, और रीसेट होने पर इसे दोहराता है। इसीलिए आपको –

+0

को छोड़ने से पहले बफर आकार सेट करना होगा, मुझे इस विधि को पूरा करने की आवश्यकता है, या 'रीडर' कार्यान्वयन जो इस सरल ऑपरेशन का समर्थन करता है। सी भाषा में 'ftell' और' fseek' है। – emesx

+3

आप अपने आप हैं, लेकिन मुझे विचार पसंद है। यह एक ढेर के समान लगता है – Bohemian

उत्तर

8

तो मैं इसे अपने आप -.-

class CharReader { 
    private Stack marks; 
    private RandomAccessFile reader; 

    CharReader(File file) { 
     this.marks = new Stack(); 
     this.reader = new RandomAccessFile(file, 'r'); 
    } 

    void mark() { 
     long mark = reader.getFilePointer(); 
     marks.push(mark); 
    } 

    void reset() { 
     if (marks.size() <= 0) 
      return 

     long mark = marks.pop(); 
     reader.seek(mark); 
    } 

    char peek() { 
     mark(); 
     char nextChar = next(); 
     reset(); 
     return nextChar; 
    } 


    char next() { 
     int nextChar; 
     if ((nextChar = nextInt()) >= 0) { 
      return (char) nextChar; 
     } 
     throw new IllegalStateException("Reader empty"); 
    } 

    private int nextInt() { 
     return reader.read(); 
    } 
} 

यह मेरी जरूरतों के लिए काफी है लिखा था। char रों ;-)

0

आप एक PushBackReader है, जो एक unread विधि आप एक पुशबैक बफर में अवांछित पात्रों पुश करने के लिए अनुमति देता है कि है चारों ओर कुछ को लागू करने की कोशिश कर सकते का समर्थन करता है केवल सिंगल-बाइट।

char a, b;   // reader holds "ab" 
a = reader.read(); // reader holds "b" 
b = reader.read(); // reader holds "" 
reader.unread(b); // reader holds "b" 
b = reader.read(); // reader holds "" 
reader.unread(b); // reader holds "b" 
reader.unread(a); // reader holds "ab" 
a = reader.read(); // reader holds "b" 
b = reader.read(); // reader holds "" 

आवेदनों को पार्स करने के लिए इस तरह की सुविधा आपको जो चाहिए वह करने के लिए पर्याप्त है।

एक और विकल्प प्रत्येक घोंसले परत के लिए है जिसे एक नया Reader बनाने के लिए चिह्नित करने की आवश्यकता है, जिसे वे पास कर चुके हैं, और इसके बजाय उसे चिह्नित करें।