Problem:
Ein Java-Programm schreibt eine Datei mittels BufferedWriter, natürlich mit .flush() und .close(), und endet. Sofort danach soll ein anderes Programm die Datei als Input lesen.
Anscheinend schreibt die JVM die Datei nicht schnell genug, sodass das nachfolgende Programm ein "file not found" liefert, obwohl ein anschließender ls sie anzeigt ~ und der Aufruf von Hand dann funktioniert.
System:
Oracle JVM, Java 1.7.0_60, Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
SUSE Linux Enterprise Server 11
Ich meine mich zu erinnern, dass die JVM bei .flush() nur sicherstellt, dass die JVM-internen Buffer auch komplett ans OS übergeben sind, aber nicht, dass die Datei dann auch tatsächlich auf der Platte/im Dateisystem geschrieben ist.
Gelegentlich hilft es, zwischenrein sync aufzurufen, aber nicht immer.
In der Zeitschrift c't war vor einiger Zeit ein Artikel, dass früher
sichergestellt hat, dass datei2 auch tatsächlich da ist, und dies mittlerweile nicht mehr funktioniert - man muss eine OS-Routine aufrufen für einen echten Dateisystem-Flush. Leider finde ich den c't-Artikel auch nicht mehr, und für Google fehlen die schlagkräftigen Stichworte...
Hat jemand eine Idee, wie ich dieses Problem gelöst bekomme?
CU, arilou
PS: Bei dem c't Artikel ging's entweder um den Linux-Kernel, oder (wahrscheinlicher) um ext4.
Ein Java-Programm schreibt eine Datei mittels BufferedWriter, natürlich mit .flush() und .close(), und endet. Sofort danach soll ein anderes Programm die Datei als Input lesen.
Anscheinend schreibt die JVM die Datei nicht schnell genug, sodass das nachfolgende Programm ein "file not found" liefert, obwohl ein anschließender ls sie anzeigt ~ und der Aufruf von Hand dann funktioniert.
System:
Oracle JVM, Java 1.7.0_60, Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
SUSE Linux Enterprise Server 11
Ich meine mich zu erinnern, dass die JVM bei .flush() nur sicherstellt, dass die JVM-internen Buffer auch komplett ans OS übergeben sind, aber nicht, dass die Datei dann auch tatsächlich auf der Platte/im Dateisystem geschrieben ist.
Gelegentlich hilft es, zwischenrein sync aufzurufen, aber nicht immer.
In der Zeitschrift c't war vor einiger Zeit ein Artikel, dass früher
Code:
copy datei1 datei2
touch datei2
Hat jemand eine Idee, wie ich dieses Problem gelöst bekomme?
CU, arilou
PS: Bei dem c't Artikel ging's entweder um den Linux-Kernel, oder (wahrscheinlicher) um ext4.
Zuletzt bearbeitet: