关于IO流中调用flush()方法清空缓冲区的问题
首先我们要知道,flush()方法是针对于输出流的,并且是针对于有缓冲区的输出流的
而且我们要知道,关于带缓冲流的输出流的缓冲方式不止一种,有的带缓冲输出流支持动态清空缓冲区,有的则不支持
这个时候如果支持动态清空缓冲区 – 就是如果我们的缓冲区中最后一次没有装满,这个时候也会将缓冲区清空 — 也就是将缓冲区中的数据清空
如果是不支持动态清空缓冲 — 这个时候我们只要装满缓冲区之后缓冲区才会清空
这种方式下就有可能出现缓冲区中有残留数据的现象
我们的输出流在写出数据的时候都会自动的调用flush()方法来清空缓冲区,但是我们的输出流在写出数据的时候一般都是写满缓冲区之后才进行清空缓冲区,这个时候如果我们的文件读取完毕之后最后一次缓冲区没有填满,这个时候就会有一部分的数据没有写出,这一部分的数据遗留在了缓冲区之中
但是这个时候又会有很多人会有疑惑,那么为什么我经常写程序的时候都没有对输出流进行flush()清空缓冲区,但是每次写出的文件都是好的
答: 这个时候你看看你写的程序,你的程序中,你肯定是关闭了流资源了,而我们关闭输出流资源的时候会自动调用flush()方法将我们的缓冲区清空,这个时候你也就能明白为什么你一直没有清空缓冲区,但是却一直没有出现过错误
那么我们什么时候显示的调用输出流的flush()方法?
这个没有一个明确的规定,但是官方有一个规定: “我们在关闭带缓冲区的输出流对象之前最好是对这个输出流调用一次flush()方法,进行缓冲区的刷新”
也就是虽然我们关闭缓冲流的时候会自动调用flush()方法,但是java官方还是推荐我们去显示的调用一次flush()方法