2009-07-02 7 views
2

Ich verwende RandomAccessFile, um einige Schreibvorgänge in eine Datei als Teil einer Transaktion durchzuführen. Bevor ich meine Transaktion festlege, möchte ich absolut sicher sein, dass die Daten auf die Festplatte geschrieben werden. Aufruf force(boolean) auf der RAF FileChannel scheint diese Garantie zu bieten, aber wird es implizit aufgerufen, wenn ich die Datei schließe, oder muss ich es manuell aufrufen?Ruft RandomAccessFile.close() intern FileChannel.force() auf?

Hat auch jemand Einblick in was force() tatsächlich tut, und wie weit es vertraut werden kann? Ist es möglich, dass das Betriebssystem meldet, dass die Daten auf die Festplatte geschrieben wurden, obwohl es tatsächlich noch irgendwo in einem Cache sitzt? Inwiefern ist das OS/HDD/Dateisystem abhängig?

Antwort

0

Dies ist komplett FS-abhängig. Wenn Sie jedoch keine (IO) -Ausnahme erhalten, sollten Sie der JVM vertrauen und Ihre Transaktion festschreiben. Ob Sie Ihrem FS vertrauen können, ist die andere Frage. Wenn Sie beispielsweise ext4 mit aktivierter verzögerter Zuweisung verwenden, können Datenverluste bei einem sofortigen Stromausfall auftreten, selbst nachdem RandomAccessFile # force (boolean) erfolgreich zurückgegeben wurde. Die JVM greift auf die FS-API Ihres Betriebssystems zurück und kümmert sich nicht um die eigentliche Implementierung und Konfiguration.

Und ja, Sie müssen RandomAccessFile # force (boolean) vor dem Schließen aufrufen. Ob #close #force aufruft, hängt von der Implementierung des FileChannels ab.