Die gepufferten Leser sollen eine Datei sequentiell lesen. Was Sie suchen, ist die java.io.RandomAccessFile, und dann können Sie seek()
verwenden, um Sie an die gewünschte Stelle in der Datei zu bringen.
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();
}
Der "rw"
ist ein Modus, der Zeichen detailed here ist:
der Direktzugriffsleser ist wie so umgesetzt.
Der Grund, warum die Leser mit sequentiellem Zugriff so eingerichtet sind, ist, dass sie ihre Puffer implementieren können und dass Dinge nicht unter ihren Füßen geändert werden können. Zum Beispiel sollte der Dateileser, der dem gepufferten Leser gegeben wird, nur von diesem gepufferten Leser betrieben werden. Wenn es einen anderen Ort gab, der die Datei beeinflussen könnte, könnte dies zu einem inkonsistenten Vorgang führen, da ein Leser seine Position im Datei-Leseprogramm fortsetzte, während der andere dieselbe beibehalten wollte, da Sie jetzt den anderen Reader verwenden.
Könnten Sie näher ausführen? Ich habe eine Datei, die 30 MB groß ist, ich kann nicht alles in den Speicher laden. Ich habe die Daten sortiert und möchte nun eine binäre Suche direkt in der Datei durchführen. Dafür muss ich zufällig suchen. –
Heutzutage nehme ich an, du meinst 30GB, es sei denn, du verwendest wirklich kleine eingebettete hw (aber dann wäre es plattenlos) Wie auch immer, Zufallssuche auf Festplatten ruiniert oft vollständig die logarithmische Leistung der binären Suche. Ein paar Alternativen sind 1) sequentieller Zugriff (ja, auf der Festplatte ist eine sequentielle Suche möglicherweise schneller als eine binäre Suche) oder 2) ein gemischter Ansatz wie die Verwendung von B-Baum http://en.wikipedia.org/wiki/ B-Baum Wenn diese Hinweise nicht genug sind, möchten Sie vielleicht Ihre Frage als separate statt als Kommentar stellen (bitte, posten Sie hier einen Kommentar mit einem Link zu der Frage, um mich zu pingen) – Davide