Java BufferedReader torna all’inizio di un file di testo?

Al momento ho 2 BufferedReader s inizializzati sullo stesso file di testo. Quando ho finito di leggere il file di testo con il primo BufferedReader , io uso il secondo per fare un altro passaggio attraverso il file dall’alto. Sono necessari più passaggi attraverso lo stesso file.

So di reset() , ma deve essere preceduto dal mark() chiamata mark() e mark() deve conoscere la dimensione del file, qualcosa che non penso dovrei dovermi preoccupare.

Idee? Pacchetti? Libs? Codice?

Grazie TJ

Qual è lo svantaggio della semplice creazione di un nuovo BufferedReader da leggere dall’alto? Mi aspetto che il sistema operativo memorizzi il file nella cache se è abbastanza piccolo.

Se sei preoccupato per le prestazioni, hai dimostrato che si tratta di un collo di bottiglia? Farei la cosa più semplice e non mi preoccuperei fino a quando non avrai una ragione specifica per farlo. Voglio dire, puoi solo leggere l’intera cosa in memoria e poi fare i due passaggi sul risultato, ma di nuovo sarà più complicato della semplice lettura dall’inizio con un nuovo lettore.

I lettori di Buffered hanno lo scopo di leggere un file in sequenza. Quello che stai cercando è java.io.RandomAccessFile , e quindi puoi usare seek() per portarti dove vuoi nel file.

Il lettore ad accesso casuale è implementato in questo modo:

 try{ String fileName = "c:/myraffile.txt"; File file = new File(fileName); RandomAccessFile raf = new RandomAccessFile(file, "rw"); raf.readChar(); raf.seek(0); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Il "rw" è un carattere di modalità che è dettagliato qui .

La ragione per cui i lettori ad accesso sequenziale sono impostati in questo modo è che possano implementare i loro buffer e che le cose non possano essere cambiate sotto i loro piedi. Ad esempio, il lettore di file che viene fornito al lettore bufferizzato dovrebbe essere utilizzato solo da quel lettore bufferizzato. Se ci fosse un altro percorso che potrebbe influenzarlo, potresti avere delle operazioni incoerenti dato che un lettore ha avanzato la sua posizione nel lettore di file mentre l’altro voleva che rimanesse lo stesso ora che usi l’altro lettore e si trovi in ​​una posizione indeterminata.

Il modo migliore per procedere è cambiare il tuo algoritmo, in un modo in cui NON avrai bisogno del secondo passaggio. Ho usato questo approccio un paio di volte, quando ho dovuto gestire file enormi (ma non terribili, cioè pochi GB) che non si adattavano alla memoria disponibile.

Potrebbe essere difficile, ma il guadagno in termini di prestazioni di solito vale lo sforzo

Informazioni sul contrassegno / reset:

Il metodo mark in BufferedReader utilizza un parametro readAheadLimit che limita la distanza che è ansible leggere dopo un segno prima che il ripristino diventi imansible. Il ripristino non significa in realtà un seek del file system (0), ma cerca solo all’interno del buffer. Per citare il Javadoc:

readAheadLimit – Limita il numero di caratteri che possono essere letti pur conservando il segno. Dopo aver letto questo numero di caratteri, il tentativo di reimpostare il stream potrebbe non riuscire. Un valore limite maggiore della dimensione del buffer di input causerà l’allocazione di un nuovo buffer la cui dimensione non è inferiore al limite. Pertanto, i valori elevati dovrebbero essere utilizzati con caucanvas.

“L’intera attività su mark () e reset () in BufferedReader sa di design scadente.”

perché non estendere questa class e fargli fare un mark () nel costruttore () e poi fare un seek (0) nel metodo topOfFile ().

BR,
~ A