Domanda

Sto cercando di cercare attraverso un RandomAccessFile, e come parte di un algoritmo devo leggere una riga, e poi cercare a ritroso dalla fine della riga

es

String line = raf.readLine();
raf.seek (raf.getFilePointer() - line.length() + m.start() + m.group().length());

//m is a Matcher for regular expressions

Sono stato sempre carichi di errori di off-by-one e non riuscivo a capire perché. Ho appena scoperto è perché alcuni file che sto leggendo da avere ritorni a capo in stile UNIX, \ r \ n, e alcuni hanno solo finestre in stile \ n.

C'è un facile avere la RandomAccessFile trattare tutti i ritorni a capo come linefeeds finestre in stile?

È stato utile?

Soluzione

Si può sempre indietro il flusso di due byte e ri-leggere loro per vedere se si tratta di \ r \ n o (! \ R) \ n:

String line = raf.readLine();
raf.seek(raf.getFilePointer()-2);
int offset = raf.read() == '\r' ? 2 : 1;
raf.read(); //discard the second character since you know it is either \n or EOF by definition of readLine
raf.seek (raf.getFilePointer() - (line.length()+offset) + m.start() + m.group().length());

Non sono sicuro esattamente dove si sta cercando di posizionare il puntatore del file, in modo da regolare i 2/1 costanti in modo appropriato. Potrebbe anche essere necessario aggiungere un controllo in più per righe vuote (\ n \ n) se si verificano nel file, come se si presenta si potrebbe ottenere bloccato in un ciclo infinito senza codice di fare un passo oltre.

Altri suggerimenti

No. RandomAccessFile e astrazioni correlati (inclusi i file system sottostanti) file modello come una sequenza di byte indicizzabile. Essi non conoscono o si preoccupano di linee o terminazioni di linea.

Quello che dovete fare è registrare le posizioni effettive di linea inizia piuttosto che cercare di capire dove si basano su ipotesi su ciò che la sequenza di terminazione di linea è. In alternativa, utilizzare un lettore di linea che cattura la sequenza di terminazione per ogni riga che legge, sia come parte della linea o in un attributo che può essere letta dopo aver letto ciascuna linea di ingresso.

In alternativa, convertire tutti i file da utilizzare DOS sequenze di terminazione della linea prima di aprirli per l'accesso casuale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top