Hallo!
Mir stellt sich folgendes Problem:
Ein mir nicht näher bekanntes Programm ("Programm1") aktualisiert ständig den Inhalt einer Textdatei, den ich mit einem weiteren Programm ("Programm2") auslesen soll.
Nun hatte ich die Vermutung, dass es bei gleichzeitigem Zugriff bzw. Änderung einer Datei Probleme geben kann und wurde durch eine kurze Recherche bestätigt.
Ich habe leider keine genauen Angaben darüber, auf welche Art die Textdatei durch Programm1 verändert wird, aber wie auch immer dieser Vorgang im Detail aussieht - ich denke mir, das Auslesen zu einem Zeitpunkt, wo eine Änderung begonnen aber nicht abgeschlossen wurde, wird zu falschen Ergebnissen führen, z.B. wenn der alte Inhalt gelöscht und noch kein neuer hinzugefügt wurde.
Bevor ich meine Ansätze für konkreten Lösungsvorschläge vorstelle, habe ich zuerst noch eine grundlegende Frage:
Wenn ich eine Datei test.txt durch
öffne und diese danach (aber vor dem Schließen des Streams!) von außen geändert wird - wirkt sich das auf nachfolgende br.readLine() Aufrufe aus? Meine Vermutung: Bei FileReader-Objekten schon. Bei BufferedReader-Objekten allerdings wird der zu lesende Inhalt schon bei der Erzeugung des Readers in den Puffer geladen und ist deshalb "sicher" vor Veränderungen von außen. Allerdings weiß ich nicht, wie viel Text gepuffert wird - da die Textdatei klein ist und man die Puffergröße auch variieren kann, schätze ich, dass auch der gesamte Text gepuffert werden kann.
Im Folgenden gehe ich also davon aus, dass bei Änderungen der Datei während Auslesevorgängen mit einem BufferedReader-Objekt nichts schiefgeht.
[EDIT: Ach Mist. Während des Puffer-Vorgangs, der ja ein wiederholtes normales Einlesen ist, kann die Datei ja auch geändert werden. Mist.]
So, jetzt habe ich gelesen, dass Dateien "gelocked" werden können, um sie für eine bestimmte Zeit für bestimmte Zugriffe zu sperren. Wenn ich die vorliegende Situation richtig sehe, dann sollte Programm1 die lock-Methode einsetzen, um die Datei während eines Schreibvorgangs zu sperren - darauf habe ich allerdings leider keinen direkten Einfluss.
Hier also zwei alternative Vorschläge:
1) Programm1 zeigt durch eine Zeichenkette am Dateianfang an, ob die Datei gerade bearbeitet wird oder gelesen werden kann. Diese Zeichenkette setzt sie als ersten und letzten Schritt jeden Schreibvorganges. Wenn Programm2 beim Auslesen feststellt, dass die Datei bearbeitet wird, wird der Auslesevorgang beendet.
Falls meine Vermutung oben falsch war, kann eine Änderung während des Lesevorgangs (nach der Überprüfung der Zeichenkette) dann allerdings immernoch zu falschen Ergebnissen führen.
2) Programm2 prüft beim Auslesen immer, ob das erwartete Format eines vollständigen Wertes gegeben ist. Ist es das nicht, wird in diesem Einlesevorgang nichts getan. Das ist nicht sondernlich dramatisch, da Programm1 in einer sehr langsamen Frequenz, Programm2 hingegen in einer sehr hohen Frequenz arbeitet.
Meiner Meinung nach müsste dieses Verfahren selbst dann funktionieren, wenn meine Vermutung oben falsch war, da das Format einer bereits eingelesenen Zeichenkette überprüft wird, deren Inhalt dann ja nun wirklich nicht mehr verändert werden kann. Probleme könnte es nur geben, wenn der Inhalt so schnell verändert wird, dass ein "Treffer" im richtigen Moment die Ausnahme wird und Programm2 den Auslesevorgang ständig abbrechen muss - das ist wie gerade beschrieben aber ja nicht der Fall.
Von diesen beiden Vorschlägen favorisiere ich derzeit Lösung 2 - allerdings bin ich mir bei beiden nicht sicher, ob sie das Problem wirklich zuverlässig lösen. Von daher wäre ich um Kritik oder Vorschläge sehr dankbar!
Vielen Dank für's Lesen und einen schönen Abend!
muhazz
Mir stellt sich folgendes Problem:
Ein mir nicht näher bekanntes Programm ("Programm1") aktualisiert ständig den Inhalt einer Textdatei, den ich mit einem weiteren Programm ("Programm2") auslesen soll.
Nun hatte ich die Vermutung, dass es bei gleichzeitigem Zugriff bzw. Änderung einer Datei Probleme geben kann und wurde durch eine kurze Recherche bestätigt.
Ich habe leider keine genauen Angaben darüber, auf welche Art die Textdatei durch Programm1 verändert wird, aber wie auch immer dieser Vorgang im Detail aussieht - ich denke mir, das Auslesen zu einem Zeitpunkt, wo eine Änderung begonnen aber nicht abgeschlossen wurde, wird zu falschen Ergebnissen führen, z.B. wenn der alte Inhalt gelöscht und noch kein neuer hinzugefügt wurde.
Bevor ich meine Ansätze für konkreten Lösungsvorschläge vorstelle, habe ich zuerst noch eine grundlegende Frage:
Wenn ich eine Datei test.txt durch
Java:
File f = new File("test.txt");
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader (fr);
Im Folgenden gehe ich also davon aus, dass bei Änderungen der Datei während Auslesevorgängen mit einem BufferedReader-Objekt nichts schiefgeht.
[EDIT: Ach Mist. Während des Puffer-Vorgangs, der ja ein wiederholtes normales Einlesen ist, kann die Datei ja auch geändert werden. Mist.]
So, jetzt habe ich gelesen, dass Dateien "gelocked" werden können, um sie für eine bestimmte Zeit für bestimmte Zugriffe zu sperren. Wenn ich die vorliegende Situation richtig sehe, dann sollte Programm1 die lock-Methode einsetzen, um die Datei während eines Schreibvorgangs zu sperren - darauf habe ich allerdings leider keinen direkten Einfluss.
Hier also zwei alternative Vorschläge:
1) Programm1 zeigt durch eine Zeichenkette am Dateianfang an, ob die Datei gerade bearbeitet wird oder gelesen werden kann. Diese Zeichenkette setzt sie als ersten und letzten Schritt jeden Schreibvorganges. Wenn Programm2 beim Auslesen feststellt, dass die Datei bearbeitet wird, wird der Auslesevorgang beendet.
Falls meine Vermutung oben falsch war, kann eine Änderung während des Lesevorgangs (nach der Überprüfung der Zeichenkette) dann allerdings immernoch zu falschen Ergebnissen führen.
2) Programm2 prüft beim Auslesen immer, ob das erwartete Format eines vollständigen Wertes gegeben ist. Ist es das nicht, wird in diesem Einlesevorgang nichts getan. Das ist nicht sondernlich dramatisch, da Programm1 in einer sehr langsamen Frequenz, Programm2 hingegen in einer sehr hohen Frequenz arbeitet.
Meiner Meinung nach müsste dieses Verfahren selbst dann funktionieren, wenn meine Vermutung oben falsch war, da das Format einer bereits eingelesenen Zeichenkette überprüft wird, deren Inhalt dann ja nun wirklich nicht mehr verändert werden kann. Probleme könnte es nur geben, wenn der Inhalt so schnell verändert wird, dass ein "Treffer" im richtigen Moment die Ausnahme wird und Programm2 den Auslesevorgang ständig abbrechen muss - das ist wie gerade beschrieben aber ja nicht der Fall.
Von diesen beiden Vorschlägen favorisiere ich derzeit Lösung 2 - allerdings bin ich mir bei beiden nicht sicher, ob sie das Problem wirklich zuverlässig lösen. Von daher wäre ich um Kritik oder Vorschläge sehr dankbar!
Vielen Dank für's Lesen und einen schönen Abend!
muhazz
Zuletzt bearbeitet: