Java:RandomAccessFile模式“rws”与“rwd”有什么区别?

15
RandomAccessFile构造函数接收一个指定如何打开文件的mode字符串。
我对"rws""rwd"模式之间的区别感到困惑。
这是文档中的说明:
“rws” 读写方式打开,要求每次更新文件内容或元数据都同步写入底层存储设备。
“rwd” 读写方式打开,要求每次更新文件内容都同步写入底层存储设备。
“rwd”模式可用于减少执行的I/O操作。使用“rwd”只需要将文件内容的更新写入存储器;而使用“rws”则需要同时将文件内容和其元数据的更新写入,这通常需要至少多一次低级I/O操作。
...但没有解释metadata的含义。这是否意味着"rws"会在文件系统上更新最后修改时间戳,而"rwd"不会?

@T.J. Crowder 还有哪些类似的属性? - Cristian Diaconescu
@ Cristi:不知道,是更改所有者和组权限吗?在*nix文件系统上执行位。只读位(在具有此功能的FS上)。等等... - T.J. Crowder
@T.J. Crowder 我在这个类的API中找不到任何明显会改变这些属性的东西。 - Cristian Diaconescu
1
以下是一些属性 http://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html - ya_pulser
2个回答

20
这是什么意思? "rws"是否更新了文件系统上的最后修改时间,而"rwd"则不更新?
"rws" 会刷新文件的内容以及修改日期。
"rwd" 刷新文件的内容,但修改日期可能只有在关闭文件时才会更新。
"rw" 只在你命令它刷新时才会进行,直到关闭文件之前也不会更改修改日期。
顺便说一下,相对于"rw","rwd"写入速度慢得多,而"rws"则更慢。

1
@fge 提示定义了必须发生的最小内容,因为它涉及提供保证。操作系统可以做更多的事情,例如为新文件设置ctime。 - Peter Lawrey
2
@fge 当您更改内容时,即使使用“rw”,这些更改也会立即显示。 我在编写的库中使用它来在进程之间共享数据,延迟可以低至100纳秒。 它所不能做的是实际将数据写入磁盘,因此即使看起来信息已更改,数据仍未写入磁盘。 使用“rws” / “rwd”确保在继续之前将数据写入磁盘,例如防止操作系统崩溃或停电时数据丢失。 - Peter Lawrey
1
@fge 我可以告诉你它慢了很多。 ;) - Peter Lawrey
1
@PeterLawrey 请问,“flushes the contents of the file”是什么意思?也许你想说的是“flushes the stream”吧? - VanechikSpace
1
如果你正在使用流,那么是的。如果你正在使用FileChannels或RandomAccessFile,则每次写入都会发生。 - Peter Lawrey
显示剩余4条评论

3

在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 提供了更多关于 rws 和 rwd 之间差异的信息(虽然名称从未被提及)。

有趣,但我不得不寻找信息。正确的网址是:http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#force(boolean) - Cristian Diaconescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接