2012-12-18 13 views
6

non riesco a trovare la funzionalità per scrivere il seguente codice in Java (o Groovy)più voti in Reader

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) è un metodo bello, ma doen't impilare i segni, che detiene solo il il più recente ..

Qualsiasi supporto dalla libreria Java o sono da solo?

+0

Credo che 'mark' inizia a memorizzare i dati internamente nella cache e li riproduce quando viene chiamato il reset. è per questo che devi impostare la dimensione del buffer prima che il segno venga scartato. –

+0

Ho bisogno di qualsiasi metodo o implementazione 'Reader' che supporti questa semplice operazione. Il linguaggio C ha 'ftell' e' fseek'. – emesx

+3

Sei da solo, ma mi piace l'idea. Sembra simile a uno Stack – Bohemian

risposta

8

Così ho scritto io stesso -.-

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

E 'sufficiente per le mie esigenze. Supporta solo singolo byte char s ;-)

0

Si potrebbe provare l'attuazione di qualcosa attorno a un PushBackReader, che ha un metodo unread che permette di spingere caratteri indesiderati in un buffer 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 "" 

Per le applicazioni di analisi simili, questo tipo di struttura è sufficiente per fare ciò che è necessario.

Un'altra opzione è per ogni livello di nidificazione che deve essere contrassegnato per costruire un nuovo Reader oltre a quello che viene passato e contrassegnarlo.