今天在学网络编程时看到大佬用flush()方法,很迷茫为啥要刷新一次java.io.BufferedOutputStream类中不是有自动触发机制吗,为啥手动flush一下?然后在网上看了一圈,直到看到下面这个照片简直醍醐灌顶。
当我们使用输出流发送数据时,当数据不能填满输出流的缓冲区时,这时,数据就会被存储在输出流的缓冲区中。如果,我们这个时候调用关闭(close)输出流,存储在输出流的缓冲区中的数据就会丢失。所以说,关闭(close)输出流时,应先刷新(flush)换冲的输出流,话句话说就是:“迫使所有缓冲的输出数据被写出到底层输出流中”。
看到这了就再看一下flush()的源码吧。
publicclass BufferedOutputStream extends FilterOutputStream
{
publicsynchronizedvoid flush() throws IOException
{
flushBuffer();
out.flush();
}
privatevoid flushBuffer() throws IOException
{
if(count > 0)
{
out.write(buf, 0, count);
count = 0;
}
}
}
看到这里大家明白了吧,为了防止过于频繁的写操作 所以Java提供java.io.BufferedOutputStream类 内部持有一个缓冲区 默认不直接将数据写到硬盘上 而是存到缓冲区中 直到一定条件后触发(就是调用上面的flushBuffer() ) 也可以强制通过flush()方法提前触发,其实flush()也是通过out.write()将数据写入底层输出流的。
顺便提一嘴,数据首先被写入到内部的缓冲区中,而不是直接写入到其目标。这可以提高性能,因为写入到缓冲区通常比直接写入到磁盘或网络更快。但是,如果你希望确保缓冲区中的数据被立即写入到其目标,也应该调用flush()
方法。