JAVA中write()方法后调用flush()方法

2019-11-30  本文已影响0人  程序员的交流电

我们都知道,文件的读取和写入的速度是很慢的,现代计算机中IO是计算机快速运行的一个瓶颈。而cpu的操作速度是很快的,如果cpu等待io,这样就会造成cpu资源的极大的浪费,程序运行的效率必然会降低的。相比之下,把数据放到缓存区,然后等到缓存区满了,然后让cpu进行io操作,当缓存区没有满,cpu就去干其他的事情。,这样就会更加的高效的,资源利用率也在提高。于是我们考虑的是先将硬盘里面的数据预加载到缓冲区(大小可以定义,选择合适的缓冲区大小),然后等待缓冲区的IO操作。这样就减少了cpu的io,提高程序运行的效率。其中将硬盘数据于内存进行交互是由IO系统来完成的。java也是采用这种方式,通过基本流处理(缓冲机制)减少IO操作。来提高程序运行的效率。

OutputStream抽象类里面的方法
public abstract void write(int b) 写出一个字节的数据
public void write(byte b[]) 把所有直接写到数组里面
public void write(byte b[], int off, int len) 把所有的数据写到数组的off到len
public void flush() 把缓存区里面的所有数据强制刷到目的地
public void close() 先把缓存区里面的所有的数据强制的刷到目的地,然后关闭流

其实也并不是说一定要在write之后使用flush的,就像使用while来写大量数据到本地,当到最后,直接的close就可以了。并不需要flush。
read()方法和write()是线程阻塞的,也就是说,当某个线程试图向另一端网络节点读取或写入数据时,有可能会发生网络连接异常或者是服务器短期内没有响应,这将会导致该线程阻塞,同样地,在无数据状态进行读取,数据已满进行写操作时,同样会发生阻塞,这时,其他线程抢占资源后继续执行。如果出现此现状,读取到缓冲池中的数据不能够及时的发送到另一端的网络节点,需要该线程再次竞争到CPU资源才可正常发送。

还有一种情况,当我们将数据预存到缓冲池中时,当数据的长度满足缓冲池中的大小后,才会将缓冲池中的数据成块的发送,若数据的长度不满足缓冲池中的大小,需要继续存入,待数据满足预存大小后再成块的发送。往往在发送文件过程中,文件末尾的数据大小不能满足缓冲池的大小。最终导致这部分的数据停留在缓冲池无法发送。

这时,就需要我们在write()方法后,手动调用flush()方法,强制刷出缓冲池中的数据,(即使数据长度不满足缓冲池的大小)从而保证数据的正常发送。当然,当我们调用流的close()方法后,系统也会自动将输出流缓冲区的数据刷出,同时可以保证流的物理资源被回收。
参考文章:https://blog.csdn.net/qq_35271409/article/details/82057096

上一篇下一篇

猜你喜欢

热点阅读