我遇到过这两个术语,我对它们的理解似乎相互重叠。 Flush与缓冲区一起使用,同步用于讨论文件到磁盘的持久更改。
在C中,fflush(stdin)确保清除缓冲区。并且fsync保持将文件更改为磁盘。
如果这些概念不是普遍定义的,那就更喜欢linux,java的解释。
我发现了一个相关的帖子,但是我并没有真正回答我的问题。 Really force file sync/flush in Java
答案 0 :(得分:66)
在Java中,flush()
方法用于输出流和写入器,以确保写出缓冲的数据。然而,根据Javadocs:
如果此流的预期目标是底层操作系统提供的抽象,例如文件,则刷新流只保证先前写入流的字节被传递给操作系统进行写入;它不能保证它们实际上写入物理设备,如磁盘驱动器。
另一方面,FileDescriptor.sync()
可用于确保将OS缓冲的数据写入物理设备(磁盘)。这与Linux / POSIX中的sync
调用相同。
如果您的Java应用程序确实需要确保将数据物理写入磁盘,则可能需要flush
和sync
,例如:
FileOutputStream out = new FileOutputStream(filename);
[...]
out.flush();
out.getFD().sync();
参考文献: