I / O概念刷新与同步

时间:2010-11-01 20:44:08

标签: java file-io operating-system

我遇到过这两个术语,我对它们的理解似乎相互重叠。 Flush与缓冲区一起使用,同步用于讨论文件到磁盘的持久更改。

在C中,fflush(stdin)确保清除缓冲区。并且fsync保持将文件更改为磁盘。

如果这些概念不是普遍定义的,那就更喜欢linux,java的解释。

我发现了一个相关的帖子,但是我并没有真正回答我的问题。 Really force file sync/flush in Java

1 个答案:

答案 0 :(得分:66)

在Java中,flush()方法用于输出流和写入器,以确保写出缓冲的数据。然而,根据Javadocs:

  

如果此流的预期目标是底层操作系统提供的抽象,例如文件,则刷新流只保证先前写入流的字节被传递给操作系统进行写入;它不能保证它们实际上写入物理设备,如磁盘驱动器。

另一方面,FileDescriptor.sync()可用于确保将OS缓冲的数据写入物理设备(磁盘)。这与Linux / POSIX中的sync调用相同。

如果您的Java应用程序确实需要确保将数据物理写入磁盘,则可能需要flushsync,例如:

FileOutputStream out = new FileOutputStream(filename);

[...]

out.flush();
out.getFD().sync();

参考文献: