深入理解Java IO的flush
Java的IO是一个大知识点,
如果把它的知识点拆开来说的话估计能说一个星期,关于IO的体系可以看看下面这张图,
接下来我们从一段代码开始聊吧,先看看下面这段代码
public class Test { public static void main(String[] args) throws Exception { File file = new File("text.txt"); if(!file.exists()) { file.createNewFile(); } FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] b = new byte[1024]; bos.write(b); bos.flush(); } }
代码中构造了一个缓冲流,然后往流里写入一个KB长度的数据,最后调用 flush()方法。
这是很简单的一段代码,最终的输出结果是会生成一个 1KB的 text.text文件。
但如果我们把最后一行注释掉的话
//bos.flush();
最终生成的 text.text大小会变成0.
这个结果是很显然的,不过如果我们把 flush()换成 close()的话,结果是不是还会是 0呢?
关于 flush
flush()这个东西,其实在很久以前的网络传输中就有了
那个时候为了效率,服务器和客户端传输数据的时候不会每产生一段数据就传一段数据
而是会建一个缓冲区,在缓冲区满之后再往客户端传输数据
有时候会有这样的问题,当数据不足以填充缓冲区,而又需要往客户端传数据,为了解决这个问题,就有了 flush的概念,将缓冲区的数据强迫发送。
回到上面的问题,如果把 flush换成 close是否可行呢
答案是可以的。
如果看源码就知道 BufferedOutputStream的继承关系
public class BufferOutputStream extends FilterOutputStream
BufferedOutputStream没有实现 close()方法,所以会直接调用 FilterOutputStream的 close(),而 FilterOutputStream的 close()方法会调用 flush()来输出缓冲区数据。
实际开发中关于IO操作的,都强调最后要调用 close()方法,上面的例子就是其中一个原因了。
相关文章
IDEA中Maven报错Cannot resolve xxx的解决方法汇总(亲测有效)
在IDEA中的pom文件中添加了依赖,并且正确加载了相应依赖,pom文件没有报红,看起来像是把所有依赖库全部加载进来了,但是代码中使用依赖的类库使报红,本文给大家介绍了IDEA中Maven报错Cannot resolve xxx的解决方法汇总,需要的朋友可以参考下2024-06-06springboot源码中this::selfInitialize怪异用法的含义解析
这篇文章主要介绍了springboot源码中this::selfInitialize怪异用法的含义解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-03-03浅谈mybatisPlus的Ipage分页和map参数的问题
这篇文章主要介绍了mybatisPlus的Ipage分页和map参数的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12JAVA使用commos-fileupload实现文件上传与下载实例解析
这篇文章主要介绍了JAVA使用commos-fileupload实现文件上传与下载的相关资料,需要的朋友可以参考下2016-02-02
最新评论