Programmieren - alles kontrollieren 4.934 Themen, 20.613 Beiträge

Wechselseitiges Schreiben und Lesen in eine Datei

m73 / 1 Antworten / Flachansicht Nickles

Ich habe folgendes Problem :


Eine Anwendung schreibt über einen FileOutputStream Sätze in eine Datei. Gleichzeitig liest eine andere Anwendung diese Datei über einen FileInputStream ein.


                fileReader = new FileInputStream("Pfad + Dateiname");


                while (true) {
                    if(fileReader.available() > 0) {
                        int numBytes = fileReader.read();
                         char c = (char) numBytes;
                    }
                }


Bein Einlesen werden zwar alle Bytes gelesen (richtige Anzahl), aber manche Characters haben den Ascii-Wert 0. In der Datei stehen diese aber richtig.


Wird die Datei vom selbem Programm danach noch einmal eingelesen, so wird alles richtig gelesen.


 

bei Antwort benachrichtigen
vergisses m73 „Wechselseitiges Schreiben und Lesen in eine Datei“
Optionen

Hallo,

die Ursache für die NULL Bytes liegt darin, daß die
StreamReader und StreamWriter buffered IO verwenden,
so daß die Daten nicht unbedingt sofort nach einem
Write schon auf der Festplatte sind.
Ein flush() könnte da helfen.

Allerdings liegt das eigentliche Problem ganz wo anders:
Du hast 2 Prozesse, die konkurrierend auf eine Ressource
(die Datei) zugreifen.

Wenn die Daten in der Datei dauerhaft gespeichert bleiben
sollen, mußt Du die Dateizugriffe zwischen den Prozessen
synchronisieren.(Sperrmechanismen usw.)

Wenn die Datei rein der Kommunikation zwischen den
Prozessen dient, mußt Du einen FIFO (First In, First Out)
Mechanismus für die Datei verwenden oder implementieren.
Dazu verwendet man in C/C++ normalerweise die "Named Pipes".

Unter Unix/Linux kann man diese einfach mit mknod oder
mkfifo einrichten und danach wie eine Datei verwenden.
Den Rest erledigt ein Unix Treiber.
(Ist das berühmte Streams Konzept von Unix).

Unter Windows ab NT aufwärts gibt es ebenfalls named Pipes.
Die arbeiten intern zwar etwas anders, aber die Verwendung ist
ähnlich.
Leider kenne ich für Windows keinen Befehl für die Einrichtung
einer Named Pipe.
Dafür müsste man evtl. ein kleines C Progrämmchen schreiben.


Wenn Du Dein Programm so umstrukturieren könntest,
dass es nur noch ein Programm mit 2 Threads ist,
würden Pipes sogar direkt von Java unterstützt.
java.io.PipedInputStream,
java.io.PipedOutputStream,
java.io.PipedReader,
java.io.PipedWriter.

Gruss, vergisses

bei Antwort benachrichtigen