java中使用FileOutStream,写入文件,有的时候明明调用了flush函数,确实没有到磁盘里面这是怎么回事呢?
我们来看下官方文档怎么说的:
flush
public void flush()
throws IOException
-
刷新此输出流并强制写出所有缓冲的输出字节。
flush
的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。
如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。
OutputStream
的 flush
方法不执行任何操作。
-
-
抛出:
-
IOException
- 如果发生 I/O 错误。
flush
的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。
如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。
OutputStream
的 flush
方法不执行任何操作。
-
抛出:
-
IOException
- 如果发生 I/O 错误。
因此我们必须使用FileOutStream的getFD() 函数,其返回FileDescriptor对象,然后在调该对象的sync方法,下面我们看下这个方法的说明:
sync
public void sync() throws SyncFailedException
- 强制所有系统缓冲区与基础设备同步。该方法在此 FileDescriptor 的所有修改数据和属性都写入相关设备后返回。特别是,如果此 FileDescriptor 引用物理存储介质,比如文件系统中的文件,则一直要等到将与此 FileDesecriptor 有关的缓冲区的所有内存中修改副本写入物理介质中,sync 方法才会返回。 sync 方法由要求物理存储(比例文件)处于某种已知状态下的代码使用。例如,提供简单事务处理设施的类可以使用 sync 来确保某个文件所有由给定事务造成的更改都记录在存储介质上。 sync 只影响此 FileDescriptor 的缓冲区下游。如果正通过应用程序(例如,通过一个 BufferedOutputStream 对象)实现内存缓冲,那么必须在数据受 sync 影响之前将这些缓冲区刷新,并转到 FileDescriptor 中(例如,通过调用 OutputStream.flush)。
-
-
抛出:
-
SyncFailedException
- 无法刷新缓冲区时抛出,或者在因为系统无法保证所有缓冲区都与物理介质同步时抛出。
-
这样下次我们就明白了。