gleichzeitiger Zugriff auf eine Textdatei

muhazz

Mitglied
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
Java:
File f = new File("test.txt");
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader (fr);
ö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
 
Zuletzt bearbeitet:

irgendjemand

Top Contributor
hatten wir doch neulich erst ...

leute ... nutzt doch mal SUFU und google ...

ohne deinen post gelesen zu haben : DAS GEHT NICHT

du kannst zwar eine datei die ein anderes programm schreibt lesen *sofern kein exklusiver zugriff erzeugt wurde* ... aber um veränderungen mitzubekommen musst du die datei immer wieder neu lesen ...

lösung : pipes , sockets , stream , datenbank , etc ...

wobei ich denke das ne datenbank das einfachste wäre ...
 

KrokoDiehl

Top Contributor
Es gibt sicher andere Methoden in Java um Dateien zu Lesen, die anderswo beschrieben werden (z.B. RandomAccessFile (Java Platform SE 7 )). Wobei nie sicher ist, dass das was Programm1 gerade schreibt auch von Programm2 gerade gelesen wird - dafür sind Dateien nicht da, weil einige andere "Dinge" dazwischen hängen. Nur weil ein Programm1 ein "write( blablabla )" ausführt landet das nicht sofort in der Datei auf der Festplatte.

Aber per se kann man Dateien schon Lesen, während sie anderswo geschrieben werden. Nur was dort an verwertbaren Daten herauskommt ist eine völlig andere Sache. Mit Java 7 gibt es auch die Möglichkeit über Dateiänderungen benachrichtigt zu werden (--> googlen).

Über die NIO-API gibt es auch Möglichkeiten Dateien zu sperren, aber auch hier ist äußerst fraglich, ob das ein guter Synchronisations-Rhythmus ist. Zumal ich dein Programm1 ja so verstanden habe, dass es außerhalb deiner Kontrolle liegt und "zufällig" arbeitet. Wie will man mit sowas interagieren?

Wenn beide Programme (gleichzeitig) die Datei beschreiben wollen wird das über Dateien ohnehin maximal komplex o_O
 

muhazz

Mitglied
ohne deinen post gelesen zu haben : DAS GEHT NICHT

Um von deinen nachfolgenden Bemerkungen zu schließen: Das hättest du besser mal getan.



@KrokoDiehl: Danke für deine Antwort. Wie gesagt, ich glaube auch nicht, dass NIO-Klassen hier weiterhelfen könnten. Leider glaube ich auch nicht, dass die RandomAccessFile-Klasse das Problem löst. Es scheint einfach eine sehr ungünstige Situation zu sein.

Aber um nochmal auf mein eigentliches Hauptanliegen zu verweisen:
muhazz hat gesagt.:
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.
Vorausgesetzt, dass Programm1 in einer sehr hohen Taktrate ausliest und Programm2 eher selten einen Wert in der Datei ändert, dann könnte damit doch schon das Problem gelöst sein. Was meint ihr dazu?
 

irgendjemand

Top Contributor
@TO

das einzige was ich gelesen habe war folgender satz : "Ein mir nicht näher bekanntes Programm ("Programm1") aktualisiert ständig den Inhalt einer Textdatei, den ich mit einem weiteren Programm ("Programm2") auslesen soll." ... mehr nicht ... *weils mich auch nicht weiter intressiert hat*

meine antwort bezog sich lediglich auf den terminus das datein für diese art von informations-austausch zwischen zwei programmen mit abstand die schlechtest wahl auf modernen systemen sind ... *noch heftiger wäre wohl sowas wie n band-laufwerk* ...

eine deutlich einfachere variante wären z.b. pipes zur dierekten interprozess-kommunikation ... oder falls das nicht möglich ist eine datenbank ... an die man dann sinnvolle queries absetzt ... und dank der verwendung von timestamps auch immer nur die daten eines bestimmten zeitraums bekommen würde ...

das problem liegt hier wohl viel eher daran das du die quelle der daten *dein "Programm1"* nicht soweit abändern kannst um dir diese einfachen möglichkeiten zu nutze zu machen ...

aber ständig ein log-file lesen ist definitiv schlechtes design ... mit sicherheit auch nicht gerade performant ... und belastet die gesamte hardware mehr als andere verfahren mit caching und der gleichen ...
 

Dyed

Mitglied
Also ganz neuer Vorschlag von meiner Seite.

Wenn ich das richtig verstanden habe, möchtest du "gleichzeitig" eine Datei lesen und bearbeiten können.
Also ich hätte das so gemacht, dass du von Anfang an sagst, dass du eine Textdatei hast, wo du was reinschreiben tust und eine Textdatei hast, wo du das auslesen tust.
Das heißt, du brauchst 2 Textdateien und musst dein Code ein bisschen umprogrammieren.
Also, wenn du jetzt 2 Textdateien hast, würde ich mir einen Timer (oder irgendwelche Kriterien) programmieren, der in einen bestimmten Rhythmus den Text aus der ersten in die zweite Textdatei kopiert.
Damit vermeidest du die Kollision zwischen BufferedReader und BufferedWriter.
 

KrokoDiehl

Top Contributor
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.

Sowas kannst du natürlich machen und so eine Datenprüfung sorgt auch dafür, dass deine Daten in Programm2 gültig bleiben. An dem Ansatz ist soweit nichts auszusetzen.

Der Performanz-Gesichtspunkt sollte natürlich bedacht werden, denn jenachdem wie groß die Datei bzw. wie aufwendig die Prüfung ist - natürlich auch wie häufig du prüfst - kann das zum Flaschenhals werden. Aber andererseits heißt es auch, man solle sich Performanzproblemen dann annehmen, wenn man welche hat ;)

Echtzeit-Updates bekommst du damit aber keinesfalls hin.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Caracasa [Threads] Gleichzeitiger Zugriff auf eine LinkedList Allgemeine Java-Themen 9
Haave Audio Device Unavailable: Kein gleichzeitiger Zugriff auf Soundsystem möglich Allgemeine Java-Themen 7
I Gleichzeitiger zugriff auf ein Long über Threads Allgemeine Java-Themen 2
J 2 Threads: Gleichzeitiger Zugriff auf ein Objekt Allgemeine Java-Themen 2
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
W Klassen Zugriff auf ein Textfile aus allen Klassen. Allgemeine Java-Themen 2
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Java Zugriff auf Netzwerklaufwerk Allgemeine Java-Themen 1
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
O Zugriff auf mySQL ohne JDBC Allgemeine Java-Themen 3
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
B Maven Zugriff auf files aus einem kompilierten jar Allgemeine Java-Themen 15
S Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes Allgemeine Java-Themen 7
W Zugriff auf Objektvariablen vs. Übergabe Allgemeine Java-Themen 3
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
Tommy Nightmare HTTP Zugriff auf Internetseite im Loginbereich Allgemeine Java-Themen 5
H Zugriff auf PHP Allgemeine Java-Themen 4
B DB-Zugriff einer Webanwendung funktioniert nicht mit Java 7 Allgemeine Java-Themen 2
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
O JNA Zugriff auf Funktion aus DLL Allgemeine Java-Themen 0
O Zugriff auf Windows Zertifikatstore Allgemeine Java-Themen 2
M Kein Zugriff auf microSD Karten Allgemeine Java-Themen 4
T Zugriff auf Datenbank Allgemeine Java-Themen 1
J Zugriff auf IMAP GMail Konto scheitert. Allgemeine Java-Themen 2
P Frontend- Zugriff auf WS- Backend Allgemeine Java-Themen 0
U Zugriff auf Datei sperren Allgemeine Java-Themen 5
N Best Practice Semi-Synchronized Zugriff Allgemeine Java-Themen 0
C Zugriff auf Event felder Allgemeine Java-Themen 0
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
F Zugriff Verweigert bei Kopieroperation? Allgemeine Java-Themen 4
T JNI: kein Zugriff auf VM in Callback-Methode eines Windows-Hooks Allgemeine Java-Themen 3
S Dynamischer Zugriff Allgemeine Java-Themen 4
Minonos Einem Programm Zugriff auf bestimmte Ordner geben Allgemeine Java-Themen 5
E Zugriff auf Dateien im Filesystem überwachen Allgemeine Java-Themen 5
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
V Zugriff auf den Objekterzeuger? Allgemeine Java-Themen 4
M Zugriff zweier Threads auf diesselbe Methode Allgemeine Java-Themen 16
B Zugriff auf eine HashMap Allgemeine Java-Themen 4
B JApplet Zugriff auf Local Storage des Browser? Allgemeine Java-Themen 2
D Zugriff auf Array-Liste Allgemeine Java-Themen 19
D Eclipse Kein Zugriff auf Inhalt einer referenzierten .jar Allgemeine Java-Themen 5
B synchronisierter zugriff auf Objekt Allgemeine Java-Themen 6
nutellastulle Zugriff, Übergabe, Bearbeitung und Ausgabe von Jlist Allgemeine Java-Themen 6
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
J XML Element Zugriff Allgemeine Java-Themen 4
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
M Klassen Zugriff auf getMethode ohne Klasse zu erzeugen Allgemeine Java-Themen 6
A Input/Output Applet-Zugriff auf PHP-Schnittstelle (externer Server) Allgemeine Java-Themen 22
H Vererbung Abgeleitete Klassen und Zugriff Allgemeine Java-Themen 2
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
J Zugriff auf Poker-Client Fenster Allgemeine Java-Themen 14
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
S Zugriff auf innere Klasse Allgemeine Java-Themen 3
D Kein Zugriff auf WebService ausser localhost Allgemeine Java-Themen 4
Sonecc Zugriff auf Class File einer anderen Jar während der Laufzeit Allgemeine Java-Themen 2
J Zugriff auf Dateien auf einem shared Folder? Allgemeine Java-Themen 3
H Zugriff auf VBA in Java Allgemeine Java-Themen 2
G Letzter Zugriff auf Datei Allgemeine Java-Themen 5
C java.io.FileNotFoundException: (Zugriff verweigert) Allgemeine Java-Themen 14
O Zugriff auf Serielle Schnittstelle - Keine Ports gefunden. Allgemeine Java-Themen 8
C Webstart: Zugriff auf lokale Dateien? Allgemeine Java-Themen 2
X Zugriff auf ComboBoxen in Hauptklasse von zweiter Klasse aus Allgemeine Java-Themen 8
J Zugriff auf gemeinsame Funktionen Allgemeine Java-Themen 4
Airwolf89 Zugriff auf ArrayList<ArrayList> Allgemeine Java-Themen 3
Airwolf89 Zugriff auf Werte in ArrayList<ArrayList> Allgemeine Java-Themen 4
T Zugriff zwischen Klassen für repaint Allgemeine Java-Themen 7
N Zugriff auf eine Referenzvar. Allgemeine Java-Themen 3
S Zugriff auf Klasse Allgemeine Java-Themen 4
Meldanor Mehrdimensionale Arrays : Zugriff auf n-tes Array Allgemeine Java-Themen 5
E JNA:Zugriff auf Common-Block von Fortran bzw. Struct in C Allgemeine Java-Themen 2
T Zugriff auf Singleton verkürzen - Namespaces?? Allgemeine Java-Themen 20
L Zugriff auf ein Objekt mit mehreren Threads Allgemeine Java-Themen 11
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
S Zugriff auf einzelne Bildpunkte Allgemeine Java-Themen 3
D Referenzen weiterreichen vs. statischer Zugriff Allgemeine Java-Themen 3
V Zugriff auf Default-Package? Allgemeine Java-Themen 6
P RegeEx-Problem: Zugriff auf group Allgemeine Java-Themen 2
M Zugriff auf Parallel-Schnittstelle Allgemeine Java-Themen 2
B Zugriff mit einem Applet auf den Datenträger Allgemeine Java-Themen 11
S Innere Klasse: Zugriff auf äußere Variable Allgemeine Java-Themen 5
I Zugriff auf Daten Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
D Zugriff auf Windows Dienste Allgemeine Java-Themen 7
G Zugriff auf Memberclasses einer geladenen Class-Datei Allgemeine Java-Themen 2
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
J Kein Zugriff auf Klassen im Default Package Allgemeine Java-Themen 8
M Paralleler Zugriff auf statische Methode Allgemeine Java-Themen 5
S Zugriff auf unterschiedliche JREs Allgemeine Java-Themen 7
M "Unzulässiger Zugriff auf einen Speicherbereich" Allgemeine Java-Themen 7
A Zugriff auf Parallelport nur über Eclipse nicht über .jar ! Allgemeine Java-Themen 12
G Zugriff auf ein sama share Allgemeine Java-Themen 8
J Java zugriff auf Exchange Server Allgemeine Java-Themen 10
D eclipse: Zugriff auf Ordner per code Allgemeine Java-Themen 4
O Konkurrierender Zugriff auf Log-Datei mit Log4J Allgemeine Java-Themen 11
L Zugriff auf Objekt das sich in einer Liste befindet Allgemeine Java-Themen 2
J Zugriff auf den Namen einer Variablen Allgemeine Java-Themen 7
J Zugriff auf Map in anderer Klasse Allgemeine Java-Themen 2
J Endlosschleife durch wechselseitigen Zugriff zweier Klassen? Allgemeine Java-Themen 2
F Zugriff auf lokalen Rechner wer weiss Rat ? Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben