为什么部分IO流在调用Close()方法之前要先调用flush()方法
2017-12-08 10:25
731 查看
很多人可能一直比较纠结为什么有的带有缓冲功能的流在CLose()方法之前要先调用flush()方法 ,
我们先大概说一下带缓冲功能的流的原理 : 如果是需要频繁的对文件进行读或写 , 普通流的速度会比较慢 , 而缓冲流是在普通流的基础上多了一个缓冲区 , 当读或写的数据达到一定量 , 再自动往文件里进行读写 , 如果没有装满缓冲区文件就已经读(写)完毕 , 那么这个时候已经读写到缓冲区的数据需要手动使其朝目标文件进行读写.
这个手动的过程 , 就是我们这里提到的flush()方法 .
换句话说 , 如果是文件读写完的同时缓冲区刚好装满 , 那么缓冲区会把里面的数据朝目标文件自动进行读或写 , 这种时候你直接调用close()方法不会出现问题 ; 但是如果文件在读写完成时 , 缓冲区没有装满 , 就直接调用close()方法 , 这个时候装在缓冲区的数据就不会自动的朝目标文件进行读或写 , 从而造成缓冲区中的这部分数据丢失 , 所以这个是时候就需要在close()之前先调用flush()方法 ,
手动使缓冲区数据读写到目标文件. 举个例子: 如果一个文件大小是20kb , 我们的缓冲区大小是15kb , 如果Close()方法之前没有先调用flush()方法 , 那么这个时候剩余的5kb数据就会丢失 .
我们先大概说一下带缓冲功能的流的原理 : 如果是需要频繁的对文件进行读或写 , 普通流的速度会比较慢 , 而缓冲流是在普通流的基础上多了一个缓冲区 , 当读或写的数据达到一定量 , 再自动往文件里进行读写 , 如果没有装满缓冲区文件就已经读(写)完毕 , 那么这个时候已经读写到缓冲区的数据需要手动使其朝目标文件进行读写.
这个手动的过程 , 就是我们这里提到的flush()方法 .
换句话说 , 如果是文件读写完的同时缓冲区刚好装满 , 那么缓冲区会把里面的数据朝目标文件自动进行读或写 , 这种时候你直接调用close()方法不会出现问题 ; 但是如果文件在读写完成时 , 缓冲区没有装满 , 就直接调用close()方法 , 这个时候装在缓冲区的数据就不会自动的朝目标文件进行读或写 , 从而造成缓冲区中的这部分数据丢失 , 所以这个是时候就需要在close()之前先调用flush()方法 ,
手动使缓冲区数据读写到目标文件. 举个例子: 如果一个文件大小是20kb , 我们的缓冲区大小是15kb , 如果Close()方法之前没有先调用flush()方法 , 那么这个时候剩余的5kb数据就会丢失 .
相关文章推荐
- IO流中flush()和close()方法的区别
- lucene已经调用optimize和close方法,为什么索引路径下还有上千个.cfs文件?
- 为什么requestWindowFeature()方法要在setContentView()方法之前调用?
- IO流(4)--Flush()和Close()方法的区别
- 黑马程序员——对io流的flush与close方法的理解
- 在使用JS调用Window.close()方法关闭一个窗口是,如何禁止弹出对话窗口?
- JDBC在getConnection之前为什么要调用Class.forName
- Java 中接口为什么可以调用 toString 方法,接口中根本就没有 toString 方法?
- IOS viewdidload 方法在 init 方法之前调用
- JDBC在getConnection之前为什么要调用Class.forName(转)
- close()方法应该在finally语句中调用吗?
- 1.为什么需要继承?如何继承?继承到什么? 2.方法的重载与重写的区别 3.类型的自动转换和强制转换 4.子类特有的方法的调用规则 5.子类重写的方法的调用规则 6.多态的理解 7.面向对象的三大特征
- 为什么cellForRowAtIndexPath方法不调用?
- iOS开发tableview为什么没有调用heightForRowAtIndexPath方法
- 调用window.close()不需要确认的方法
- 在一个方法调用之前保证另一个方法已经执行
- java中静态方法为什么不能调用非静态方法或者变量
- 为什么不能从静态的方法里面调用非静态方法,或变量?
- 在界面跳转的时候,控制器调用prepareForSegue方法,为什么不能目的控制器的imageView属性赋值
- 为什么每次运行程序之前,VS都要先编译的解决方法