2013-01-09 71 views
11

RandomAccessFile constructor接受mode字符串,指定應如何打開文件。Java:RandomAccessFile模式「rws」vs「rwd」?

我對"rws""rwd"模式之間的區別感到困惑。

下面介紹一下docs狀態:

「RWS」開放閱讀和寫作,與「RW」,並要求 每個更新文件的內容或元數據寫入 同步到底層存儲設備。

「rwd」開放閱讀和寫入,與「rw」一樣,並且還要求 對文件內容的每次更新都與底層存儲設備同步寫入 。

[...]

的 「RWD」 模式可用於減少執行I/O操作 的數量。使用「rwd」只需要將文件內容更新爲0​​即可寫入存儲;使用「rws」需要更新文件的 內容及其要寫入的元數據,這通常需要至少一個 至少一個低級I/O操作。

...並且沒有關於什麼metadata的含義的解釋。這是否意味着"rws"更新了文件系統上的最後修改時間戳,而"rwd"沒有?

+0

@ T.J一些信息。 Crowder還有其他這樣的屬性? –

+0

@ Cristi:不知道,所有者和羣體權利的變化?執行位(在\ * nix文件系統上)。只讀位(在FS上有它)。等等...... –

+0

@ T.J。 Crowder我無法在這個類的API中找到任何明顯的可能會改變這些屬性的API。 –

回答

13

這是否意味着「rws」會更新文件系統上的最後修改時間戳,而「rwd」不會?

rws刷新文件的內容和文件的修改日期。

rwd刷新文件的內容,但修改日期可能不會更改,直到文件關閉。

rw只有在您告訴它時纔會刷新,並且直到您關閉文件時才更改修改日期。

BTW rwd寫入比rw慢很多,並且rws再次變慢。

+0

有些東西我沒有得到:當你修改一個文件的內容時,ctime在任何情況下都會被修改(至少在類Unix的系統中)......我必須在這裏丟失一些東西。 – fge

+0

@fge提示定義了關於提供擔保人必須發生的事情的最低限度。操作系統可以自由地做更多的事情,例如爲新文件設置ctime。 –

+0

ctime是「內容修改」時間(mtime是元數據修改 - 每次更新ctime時,由於ctime是元數據的一部分,mtime也會更新) – fge

2

有關於文件的元數據中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... 

此外,FileChannel.force(boolean metadata) API提供了有關RW和RWD之間的區別的詳細信息(雖然從來沒有提及姓名)

+0

有趣,但我不得不尋找信息。正確的URL是:http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#force(boolean) –