2013-01-09 12 views
11

Die RandomAccessFile constructor akzeptiert eine mode Zeichenfolge, die angibt, wie eine Datei geöffnet sein soll.Java: RandomAccessFile Modus "rws" vs "rwd"?

Ich bin verwirrt über den Unterschied zwischen "rws" und "rwd" Modi.

Hier ist, was die docs Zustand:

„RWs“ Open zum Lesen und Schreiben, wie mit „rw“, und auch verlangen, dass jedes Update auf die Inhalt oder Metadaten der Datei synchron geschrieben werden zum zugrunde liegenden Speichergerät.

"rwd" Öffnen zum Lesen und Schreiben, wie mit "rw", und erfordern auch , dass jede Aktualisierung auf den Inhalt der Datei synchron das zugrunde liegende Speichergerät geschrieben werden.

[...]

Der "RWD" Modus kann verwendet werden, um die Anzahl der I/O-Operationen durchgeführt zu reduzieren. Die Verwendung von "rwd" erfordert nur Aktualisierungen des Inhalts der Datei an in den Speicher geschrieben werden; die Verwendung von "rws" erfordert Aktualisierungen sowohl des Inhalts der Datei als auch ihrer zu schreibenden Metadaten, was im Allgemeinen bei mindestens eine weitere low-level E/A-Operation erfordert.

... und keine Erklärung darüber, was metadata bedeutet. Bedeutet es, dass "rws" aktualisiert die letzte Änderung Timestamp auf dem Dateisystem, und "rwd" nicht?

+0

@ T. J. Crowder Welche anderen solchen Attribute? –

+0

@ Cristi: Keine Änderung der Eigentümer- und Gruppenrechte? Execute Bit (auf \ * nix Dateisystemen). Read-Only-Bit (auf FS, die es haben). Etc. –

+0

@ T.J. Crowder Ich kann nichts Offensichtliches in der API dieser Klasse finden, die diese Attribute ändern könnte. –

Antwort

13

Bedeutet es, dass "rws" den letzten modifizierten Zeitstempel im Dateisystem aktualisiert, und "rwd" nicht?

rws löscht den Inhalt der Datei und das Änderungsdatum der Datei.

rwd spült den Inhalt der Datei, aber das Änderungsdatum ändert sich möglicherweise erst, wenn die Datei geschlossen wird.

rw wird nur geleert, wenn Sie ihm dies mitteilen, und ändert das Änderungsdatum nicht, bis Sie die Datei schließen.

BTW rwd ist viel langsamer für Schreibvorgänge als rw, und rws ist wieder langsamer.

+0

Da ist etwas was ich nicht bekomme: wenn man den Inhalt einer Datei ändert, wird ctime auf jeden Fall modifiziert (zumindest bei Unix {-like} Systemen) ... ich muss hier etwas vermissen. – fge

+0

@fge Die Hinweise definieren das Minimum dessen, was passieren muss, da es darum geht, Garantien zu geben. Das OS kann mehr als dies z. Stellen Sie die ctime für eine neue Datei ein. –

+0

ctime ist "Content Modification" -Zeit (mtime ist Metadatenänderung - jedes Mal wenn ctime aktualisiert wird, wird auch mtime aktualisiert, da ctime Teil der Metadaten ist) – fge

2

Es gibt einige Informationen über Datei-Metadaten in Filechannel API http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html

...The file may also have some associated metadata such as access permissions, content type, and last-modification time... 

Außerdem FileChannel.force(boolean metadata) API weitere Informationen über den Unterschied zwischen RWs und RWD bietet (obwohl die Namen werden nie erwähnt)

+0

Interessant, aber ich musste für die Info jagen. Die richtige URL lautet: http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#force(boolean) –