Ich verwende RandomAccessFile in Java:
%Vor%Wie kann ich sicherstellen, dass diese Daten an das Betriebssystem gesendet werden? Es gibt keine file.flush () -Methode. (Beachten Sie, dass ich eigentlich nicht erwarte, dass es physikalisch geschrieben wird, ich bin damit zufrieden, dass es zum Betriebssystem geleert wird, so dass die Daten einen Tomcat-Crash überstehen, aber nicht unbedingt einen unerwarteten Serverleistungsverlust).
>Ich benutze Tomcat6 unter Linux.
Die einzigen Klassen, die eine .flush()
-Methode bereitstellen, sind diejenigen, die tatsächlich ihre eigenen Puffer beibehalten. Da java.io.RandomAccessFile
selbst keinen Puffer verwaltet, muss es nicht geleert werden.
Schauen Sie sich den RandomAccessFile-Konstruktor javadoc genau an:
Die Modi "rws" und "rwd" funktionieren ähnlich wie die force (boolean) -Methode der FileChannel-Klasse und übergeben Argumente von "true" bzw. "false", außer dass sie immer für jede E / A-Operation gelten und daher häufig sind effizienter. Wenn sich die Datei auf einem lokalen Speichergerät befindet und ein Aufruf einer Methode dieser Klasse zurückgibt, wird garantiert, dass alle durch diesen Aufruf an der Datei vorgenommenen Änderungen auf dieses Gerät geschrieben wurden . Dies ist nützlich, um sicherzustellen, dass kritische Informationen bei einem Systemabsturz nicht verloren gehen. Wenn sich die Datei nicht auf einem lokalen Gerät befindet, wird keine solche Garantie gewährt.
Hier ist, was ich in meiner App mache:
%Vor%das ist 3-4 mal mehr Leistung verglichen mit getFd (). sync () und 5-7 mal im Vergleich zu "rws 'Modus
macht genau das, was die ursprüngliche Frage vorgeschlagen hat: Pässe auf nicht gespeicherte Daten zum Betriebssystem und von JVM. Nicht physisch auf die Festplatte schreiben, und bringt daher keine lästigen Verzögerungen
Ich bin hier mit der gleichen Neugierde angekommen.
Und ich kann mir wirklich nicht vorstellen, was auf OS zu spülen und nicht unbedingt auf Disk zu bündeln braucht.
Meiner Meinung nach
Die beste Übereinstimmung mit dem Konzept einer verwalteten Flushing ist getFD().sync()
, wie @AVD gesagt hat,
das sieht so aus, dass es in seiner Dokumentation sehr ähnlich aussieht wie FileChannel # force (boolean) funktioniert mit true
.
Nun scheinen "rws"
und "rwd"
so zu funktionieren, als würden sie StandardOpenOption#SYNC
und StandardOpenOption#DSYNC
, bzw. FileChannel
ist open
.