如何刷新'RandomAccessFile'(java)?

时间:2011-09-26 02:39:49

标签: java flush

我在java中使用RandomAccessFile:

file = new RandomAccessFile(filename, "rw");
...
file.writeBytes(...);

如何确保将此数据刷新到操作系统?没有file.flush()方法。 (请注意,我实际上并不期望它是物理写入的,我很满意它被刷新到操作系统,因此数据将在tomcat崩溃后继续存在,但不一定是意外的服务器断电)。

我在Linux上使用tomcat6。

6 个答案:

答案 0 :(得分:12)

提供.flush()方法的唯一类是那些实际维护自己的缓冲区的类。由于java.io.RandomAccessFile本身不维护缓冲区,因此不需要刷新它。

答案 1 :(得分:6)

仔细查看RandomAccessFile构造函数javadoc:

“rws”和“rwd”模式的工作方式与FileChannel类的force(boolean)方法非常相似,分别传递true和false参数,但它们始终适用于每个I / O操作,因此通常更高效。如果文件驻留在本地存储设备上,那么当调用此类的方法返回时,可以保证该调用对该文件所做的所有更改都将写入该设备。这对于确保在系统崩溃时不会丢失关键信息非常有用。如果该文件不驻留在本地设备上,则不会进行此类保证。

答案 2 :(得分:4)

您可以使用getFD().sync()方法。

答案 3 :(得分:3)

这是我在我的应用中所做的事情:

rf.close();
rf = new RandomAccessFile("mydata", "rw");

这可以使性能提高3-4倍 与“rws”模式

相比,getFd()。sync()和5-7倍

完全解释原始提出的问题:通过 未保存的数据到操作系统和JVM。不是身体上的 写入磁盘,因此没有引入恼人的延迟

答案 4 :(得分:1)

我带着同样的好奇心来到这里。

我真的无法确定需要在操作系统上刷新,而不一定需要刷新到磁盘部分。

在我看来,

对于 托管刷新 的概念,最好的事情是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"看起来好像分别指定StandardOpenOption#SYNCStandardOpenOption#DSYNCFileChannelopen。< / p>

try(RandomAccessFile raw = new RandomAccessFile(file, "rws")) {
    raw.write...
    raw.write...
    raw.wirte...
    // don't worry be happy, woo~ hoo~ hoo~
}

答案 5 :(得分:-1)

我了解到你不能......

此处提供了一些相关链接:http://www.cs.usfca.edu/~parrt/course/601/lectures/io.html 在这里:http://tutorials.jenkov.com/java-io/bufferedwriter.html