I/O概念刷新与同步

sma*_*007 35 java file-io operating-system

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

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

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

我发现了一个相关的帖子,但是我并没有真正回答我的问题.真的在Java中强制文件同步/刷新

Gro*_*uez 69

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

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

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

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

FileOutputStream out = new FileOutputStream(filename);

[...]

out.flush();
out.getFD().sync();
Run Code Online (Sandbox Code Playgroud)

参考文献:

  • 如果我可以粗略地重申这一点.因此,flush清除jvm缓冲区并将其传输到OS缓冲区.并且同步确保操作系统实际上将内容保存到文件.这有道理吗? (12认同)