我正在使用Java中的RandomAccessFile:
file = new RandomAccessFile(filename, "rw");
...
file.writeBytes(...);
如何确保这些数据被刷新到操作系统?没有file.flush()方法。(请注意,我并不希望它实际被写入,我只需要它被刷新到操作系统,以便数据可以在Tomcat崩溃后存活,但不一定能经受住意外的服务器断电)。
我正在使用Linux上的tomcat6。
只有那些维护其自己的缓冲区的类提供.flush()
方法。由于java.io.RandomAccessFile
本身不维护缓冲区,因此它不需要刷新。
getFD().sync()
方法。RandomAccessFile
刷新到操作系统而不一定刷新到物理磁盘? - Jin KwonRandomAccessFile
。每次写入数据时,您写入的数据会立即传输到操作系统。 - davmac以下是我的应用中所做的:
rf.close();
rf = new RandomAccessFile("mydata", "rw");
我也怀着同样的好奇心来到这里。
但我真的无法理解需要在操作系统上刷新,而不一定需要刷新到磁盘的部分是什么意思。
在我看来,
最符合托管刷新概念的事情是getFD().sync()
,就像@AVD所说的那样。
try(RandomAccessFile raw = new RandomAccessFile(file, "rw")) {
raw.write...
raw.write...
raw.getFD().sync();
raw.wirte...
}
根据文档,这个看起来很像 FileChannel#force(boolean) 使用 true
的工作方式。
现在,"rws"
和 "rwd"
看起来就像是在一个 FileChannel
被open
时分别指定了 StandardOpenOption#SYNC
和 StandardOpenOption#DSYNC
。
try(RandomAccessFile raw = new RandomAccessFile(file, "rws")) {
raw.write...
raw.write...
raw.wirte...
// don't worry be happy, woo~ hoo~ hoo~
}
RandomAccessFile
不是一个 OutputStream
或者 Writer
,因此不能被包装成一个 BufferedAnything。
(2) 目标正是停止缓冲,而不是加入缓冲。 - cHao
RandomAccessFile
如何只刷新到操作系统而不一定刷新到物理磁盘? - Jin Kwon