Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java I/O概念刷新与同步_Java_File Io_Operating System - Fatal编程技术网

Java I/O概念刷新与同步

Java I/O概念刷新与同步,java,file-io,operating-system,Java,File Io,Operating System,我遇到过这两个术语,我对它们的理解似乎相互重叠。Flush与缓冲区一起使用,sync用于讨论将文件的更改持久化到磁盘 在C语言中,fflush(stdin)确保缓冲区被清除。和fsync将更改文件持久化到磁盘 如果这些概念没有得到普遍的定义,我们更愿意使用linux、java解释 我找到了一个相关的帖子,但ir并没有真正回答我的问题 在Java中,在输出流和写入程序中使用flush()方法来确保写入缓冲数据。然而,根据Javadocs: 如果该流的预期目的地是底层操作系统提供的抽象,例如文件,则

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

在C语言中,fflush(stdin)确保缓冲区被清除。和fsync将更改文件持久化到磁盘

如果这些概念没有得到普遍的定义,我们更愿意使用linux、java解释

我找到了一个相关的帖子,但ir并没有真正回答我的问题

在Java中,在输出流和写入程序中使用
flush()
方法来确保写入缓冲数据。然而,根据Javadocs:

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

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

如果Java应用程序确实需要确保数据以物理方式写入磁盘,则可能需要
刷新
同步
,例如:

FileOutputStream out = new FileOutputStream(filename);

[...]

out.flush();
out.getFD().sync();
参考资料:


具体地说,我遇到了这本与Java相关的书,书中说,“确保刷新和同步”。这些步骤都涉及到什么?我想要一个既能区分两者又能区分两者的答案,如果我可以粗略地重申一下的话。因此,flush清除jvm缓冲区并将其传输到OS缓冲区。同步确保操作系统将内容保存到文件中。这是有意义的吗?也许,如果你在内部考虑,“代码>文件FielOutStudio.FrHuSH()/代码>可能会最终调用POSIX函数<代码> fWreWe()/Cyto>向OS发送任何缓冲数据。@ Grodriguez:我不太确定。FileOutputStream javadoc清楚地表明该方法没有被重写,而超类方法javadoc声明该实现不做任何事情。因此,这不仅仅是一个实现细节。@MarkCarter实际上这里没有任何争论。API说的正是:“刷新的一般约定是,调用它表示,如果先前写入的任何字节已被输出流的实现缓冲,则这些字节应立即写入其预期目的地。”然后继续说,对于OutputStream,默认实现不执行任何操作。最后一位是为开发OutputStream子类的开发人员设计的。API的用户应遵守该方法的总合同。但是当然,你可以自由地编写你的代码,正如你所看到的那样。我从来没有听说过一个API,它为“开发人员”指定了一些东西,为“用户”指定了其他东西,而不显式或隐式地这样说。猜测太多了。如果子类希望指定与超类不同的内容,那么它将重写该方法,即使只是为了在javadoc中记录事实。我想很少有用户会调用FileOutputStream.flush()。出于这个原因,我认为它将在很长一段时间内保持一个角落。至少,FileOutputStream.flush()目前是一个NOOP,这是一个很好的补充。