1) RandomAccessFile.seek imposta solo la posizione corrente del puntatore del file, nessun byte viene letto nella memoria.
2) Poiché il file è codificato in UTF-8, è un file di testo. Per la lettura dei file di testo in genere si utilizza BufferedReader, Java 7 ha anche aggiunto un metodo di convinzioni File.newBufferedReader per creare un'istanza di BufferedReader per leggere il testo da un file. Sebbene possa essere inefficiente per la lettura delle ultime n righe, ma facile da implementare.
3) Per essere efficienti abbiamo bisogno di RandomAccessFile e di leggere i file a ritroso a partire dalla fine. Ecco un esempio di base
public static void main(String[] args) throws Exception {
int n = 3;
List<String> lines = new ArrayList<>();
try (RandomAccessFile f = new RandomAccessFile("test", "r")) {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
for (long length = f.length(), p = length - 1; p > 0 && lines.size() < n; p--) {
f.seek(p);
int b = f.read();
if (b == 10) {
if (p < length - 1) {
lines.add(0, getLine(bout));
bout.reset();
}
} else if (b != 13) {
bout.write(b);
}
}
}
System.out.println(lines);
}
static String getLine(ByteArrayOutputStream bout) {
byte[] a = bout.toByteArray();
// reverse bytes
for (int i = 0, j = a.length - 1; j > i; i++, j--) {
byte tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
return new String(a);
}
E 'legge il file di byte dopo byte iniziale dalla coda alla ByteArrayOutputStream, quando LF viene raggiunta inverte i byte e crea una linea.
Due cose devono essere migliorate: 1) il buffering riconoscimento 2) EOL
fonte
2013-03-25 10:30:13
E no, 'seek()' non legge * nulla * in memoria, per non parlare dell'intero file. Hai il pieno controllo. – NPE
Ho letto quella domanda, ma mi piacerebbe capire, se il file è codificato in UTF-8, quindi l'uso di RandomAccessFile è scoraggiato? –
Non sono d'accordo con il duplicato. Questo si concentra maggiormente su RandomAccessFile, mentre l'altro riguarda maggiormente l'applicazione e non menziona nemmeno RAF. –