2012-12-18 6 views
6

nie mogę znaleźć funkcjonalność napisać następujący kod w Javie (lub Groovy)Wiele znaki czytnik

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) jest ładny, ale to metoda doen't stos znaki, to tylko trzyma najnowszy ..

Jakiekolwiek wsparcie z biblioteki Java lub czy jestem sam?

+0

Wierzę, że 'mark' zaczyna buforować dane wewnętrznie i odtwarza je po wywołaniu resetu. właśnie dlatego musisz ustawić rozmiar bufora zanim znacznik zostanie odrzucony. –

+0

Potrzebuję jakiejkolwiek metody lub implementacji 'Reader' obsługującej tę prostą operację. Język C ma 'ftell' i' fseek'. – emesx

+3

Jesteś sam, ale podoba mi się ten pomysł. Brzmi podobnie do stosu – Bohemian

Odpowiedz

8

Więc napisałem to sam -.-

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(); 
    } 
} 

To wystarczy do moich potrzeb. Obsługuje tylko jednobajtowych char s ;-)

0

Można spróbować wdrażaniu coś wokół PushBackReader, która ma metodę unread który pozwala wcisnąć niechcianych znaków do bufora pushback.

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 "" 

Aby móc analizować aplikacje, ten rodzaj obiektu wystarczy, aby zrobić to, czego potrzebujesz.

Inna opcja dotyczy każdej warstwy gniazdowania wymagającej oznakowania w celu skonstruowania nowego obiektu Reader nad tym, który jest przekazywany, i oznacz go zamiast tego.