Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich muss in einer sequentiellen Datei hin- und herspringen. Daher habe ich folgende Methode geschrieben:
Code:
/**
*
* Liest den vorherigen Datensatz
*
* @param position
* @return
* @throws java.lang.Exception
*/
private String readPreviousLine(long position) throws Exception {
StringBuilder cache = new StringBuilder();
char c;
if (position != 0) {
this.posEnde = position;
position = position - 3;
raFile.seek(position);
//Verarbeitung fuer Dateien mit variabler Datensatzlaenge
while (true) {
c = (char) raFile.read();
if (c == '\n' || position <= 0 || c == '\uFFFF') {
break;
}
cache.append(c);
position--;
raFile.seek(position);
}
if (position > 0) {
this.posStart = position + 1;
} else if (position == 0) {
cache.append(c);
this.posStart = position;
}
}
return cache.toString();
}
Was meint ihr? Kann man an dieser Methode noch was verbessern/optimieren? Die Methode funktioniert. Nur ich finde ein bisschen langsam. Das kommt meiner Meinung daher, dass ich ja immer eine Stelle zurück muss (raFile.seek(position).
lies vorwärts ein und verwende dann StringBuilder.reverse oder drehe manuell im Speicher um?
das dauert doch keine Zeit, aber das Einlesen geht dann deutlich schneller,
vielleicht sogar mit anderen Methoden, gleich ein ganzes Array einlesen oder so
naja - so einfach geht das dann doch leider nicht.
Die Dateien können mehrere Millionen Datensätze haben. Und wenn ich z.B. den 5687453 Datensatz gelesen habe, möchte ich den vorherigen haben. Und da wieder von vorne zum Lesen anfangen....
die Position hast du ja, dann geh von dort aus statt um 1 gleich um 1000 Schritte zurück,
lies 1000 Zeichen auf einmal in ein Array und schau dir dort vom letzen Index an rückwärts, ob '\n' oder '\uFFFF' enthalten ist,
Rest verwerfen oder gegebenenfalls weitere 1000 Zeichen lesen,
so kannst du auch gleich rückwärts einfügen
Die Dateien sind in der Regel variabel. Sonst wäre es ja nicht so schwer.
Der Tipp mit den 1000 Zeichen ist nicht schlecht (hätte ich auch selbst darauf können können). Werde das einbauen und schauen, obs schneller wird - denke doch mal.
Man könnte auch kurzerhand einen Index aufbauen, der die Positionen der Zeilenanfänge aufnimmt, und sich anschließend via RandomAcessFile rückwärts hangeln.