一、常见流
我们知道java中流类分为字节流和字符流。
二、关于flush()方法
许多流类都有flush()方法,我在用的时候也会感到非常困惑,什么时候我们需要使用flush()方法呢。
如果查资料,或者询问身边的人的话,我们经常会听到这样的言论:
flush()方法就是将缓冲区中的数据强制全部写入目标流中。当缓冲区中的数据满了的时候,系统会自动将会数据一次性压入目标流,但是当缓冲区还没满的时候,为了保证数据真正的写入了我们希望写入的地方,我们就需要自行调用flush()方法,否则数据将暂存在缓存中,而没有写入应该写入的地方。尤其我们如果在IO操作完毕之后没有调用close()方法,而且也没有自行调用flush()方法,就会导致一部分数据在程序结束时仍然在缓冲中,即会导致数据的丢失,甚至导致根本没有数据写入。
我们可能还是会感到疑惑。哪些类有所谓的缓冲呢?即:
哪些类需要我们手动调用flush()方法以保证IO操作的准确无误呢?
java中有一个BufferedWriter类,看类名我们就知道这个类是自带一个缓冲区的,实际上也确实是这样的。该类是一个包装类,自带一个缓冲区,当往流中写入数据时,实际上是先写入了该类中的缓冲区,当缓冲区满了之后,才会将缓冲区的数据写入实际的流中,然后重复上述操作。这样的目的是为了提高IO效率。
那是不是只有使用这个类的时候我们才需要使用flush()方法呢?
答案是否定的。事实上,在我的测试中,基本上所有的字符流都需要使用一个flush()方法来保证IO的准确操作。因而在使用字符流时,我们都应该适时调用flush()方法。