ich habe eine Logfile in die immer wieder etwas rein geschrieben wird (append). Diese möchte ich nach einem Wort durchsuchen. Die Suche endet am Ende der Logfile. Erweitert sich das Log, dann startet die Suche erneut.
Ich möchte jetzt erreichen, dass die neue Suche direkt da weitermacht, wo sie geendet ist.
Je nachdem, mit welchen Klassen du die Datei liest, gibt es üblicherweise eine Methode [c]position[/c] zur Ermittlung der aktuellen Position und [c]seek[/c], um später zu dieser Position zurückzuspringen.
Edit: Schlechte Idee, die Dateigröße als seek-Wert zu nehmen, entfernt.
Kannst es ja auch "per Hand" programmieren, also einfach eine long nehmen, um die Zeichen, die du schon durchsucht hast abzuspeichern.
Bei deiner Anwendung wäre das sogar eine sehr einfach Lösung, weil einfach am Ende eingeben kannst:
Das mit getLength hatte ich auch zuerst geantwortet, aber dann wieder zurückgezogen, weil ich es für eine schlechte Idee halte: Auf diese Weise bekommst du nämlich nicht mit, falls sich während der Auswertung die Datei geändert hat, d.h. getLength gibt dann eine größere Zahl zurück als die Anzahl der bearbeiteten Zeichen.
Ich denke ich nehme eine Kombination aus allem RandomAccessFile liesst ein, mit length Speicher ich die Größe. Ändert sich die Datei (es kommt wenn nur etwas am Ende hinzu), liesst RandomAccessFile erneut ein und springt über seek zum letzten, bekannten Punkt.
Hat zumindest in einem kurzen Test gerade funktioniert.
Ich glaube nicht, dass das folgendes Problem löst:
* Dateigröße ändert sich von 10 auf 20 Bytes
* deine Klasse fängt an zu arbeiten
* deine Klasse ist fertig und kurz davor, getLength aufzurufen
* Dateigröße ändert sich von 20 auf 30 Bytes
* deine Klasse ruft getLength auf und denkt nun, dass sie 30 Bytes verarbeitet hat
* deine Klasse fängt wegen des vorletzen Schritts erneut an - bei Stand 30, womit Bytes 20-30 fehlen
* Dateigröße ändert sich von 10 auf 20 Bytes
* Ich lese die Datei neu ein und Speicher die Größe zum Zeitpunkt des einlesen ab.
* meine Klasse ist fertig
* Dateigröße ändert sich von 20 auf 30 Bytes
* meine Klasse ließt die File erneut und speichert length. seek springt auf die 20 Byte Position und fängt ab da an
Die Performance unterscheidet sich hier nicht wahrnehmbar. Dein Vorgehen macht das von mir skizzierte Problem weniger wahrscheinlich, aber du kannst es nicht ausschließen - weil die Datei sich zu *jedem* beliebigen Zeitpunkt ändern kann, egal was dein Code gerade macht. Normalerweise lockt man für sowas die Datei, aber das kannst du ja nicht, weil der loggende Prozess das nicht mögen würde. Deshalb ist IMHO die einzig richtige Lösung, auf irgendeine Weise am Ende zu speichern, bis zu welchem Stand gerade tatsächlich gearbeitet wurde, damit du danach dort fortsetzen kannst.