本篇来学习一个小的知识点,flush方法和close方法的区别。前面我们介绍了和使用了close方法,知道是用来关闭流的操作,但是并没有介绍flush方法,字面意思的刷新的意思。下面我们来先看看一个例子,然后引出flush方法。

1.如果不关闭流执行代码

package io;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class Demo4_BufferCopy {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\jenkins.war");FileOutputStream fos = new FileOutputStream("copy.war");//创建缓冲区,对输入流进行包装BufferedInputStream bis = new BufferedInputStream(fis);//创建缓冲区,对输出流进行包装BufferedOutputStream bos = new BufferedOutputStream(fos);int b;while ( (b = bis.read()) != -1) {bos.write(b);}//关闭输入流缓冲区//bis.close();//关闭输出流缓存区//bos.close();}}

执行上面代码,你可以对比copy.war文件的大小和jenkins.war区别,发现copy.war文件会比原文件jenkins.war要小一些。为什么会发生这个情况呢,答案就是在close方法了。在Eclipse中,查看close方法的源码如下:

@SuppressWarnings("try")public void close() throws IOException {try (OutputStream ostream = out) {flush();}}

通过看close方法的源码,发现close方法里面包含一个flush方法。flush就是刷新缓冲区的功能,所以,我们可以总结close方法的作用或者特点是:具备刷新功能,在关闭流之前,就会先刷新一次缓存区,将缓冲区的字节全都刷新到文件上,再关闭流。这里,我们来解释下上面代码,没有close方法,也就是没有进行刷新操作,文件为什么会变小。文件变小,说明了还有一部分内容没有完成写入到文件。前面一篇,我们介绍了缓冲区默认大小是8192字节,上面文件在最后一次写入到文件的缓冲区里,里面字节数没有8192大小,所以不会触发自动写入操作,从而留下一部分字节没有写入到文件。只要文件不是8192字节的N倍大小,如果最后不进行close操作,肯定会丢失一部分数据。

2.用flush方法代替close方法

为了验证close方法包含flust,我们用flush方法代替close来进行测试下。

package io;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class Demo4_BufferCopy {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\jenkins.war");FileOutputStream fos = new FileOutputStream("copy.war");//创建缓冲区,对输入流进行包装BufferedInputStream bis = new BufferedInputStream(fis);//创建缓冲区,对输出流进行包装BufferedOutputStream bos = new BufferedOutputStream(fos);int b;while ( (b = bis.read()) != -1) {bos.write(b);}//关闭输入流缓冲区//bis.close();//关闭输出流缓存区//bos.close();bos.flush();}}

如果你继续注销flush方法,还是发现拷贝之后文件变小。这里来总结下flush功能,主要就是刷新的作用,刷新完还可以继续写操作,这个典型的应用可以脑补下QQ即时聊天场景就好。

3.flush和close区别

简单来说,close包含flush功能,但是flush具备刷新完,还可以继续写操作,close执行完了就流关闭了,不能再写入,所以,不能用close来代替flush。为了证明这个结论,可以执行下面代码。

package io;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class Demo4_BufferCopy {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\jenkins.war");FileOutputStream fos = new FileOutputStream("copy.war");//创建缓冲区,对输入流进行包装BufferedInputStream bis = new BufferedInputStream(fis);//创建缓冲区,对输出流进行包装BufferedOutputStream bos = new BufferedOutputStream(fos);int b;while ( (b = bis.read()) != -1) {bos.write(b);bos.flush();//bos.close();}//关闭输入流缓冲区//bis.close();//关闭输出流缓存区//bos.close();}}

我在没一次写入文件操作后,里面执行刷新一次,当然这样写的后果就是拷贝执行过程太慢,耗时。但是如果这里尝试用close方法来代替flush,就会报已经关闭了流,不能再对流进行操作的错误。

Java中IO流-18-flush和close方法的区别相关推荐

  1. Java中IO流,输入输出流概述与总结(转载自别先生文章)

    Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...

  2. Java中IO流的总结

    有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...

  3. Java中IO流体系

    转载: https://mp.weixin.qq.com/s?__biz=MzA5NzgzODI5NA==&mid=2454030958&idx=1&sn=df27aadb92 ...

  4. 【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流

    Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...

  5. Java中IO流面试题

    Java 中 IO 流分为几种? Java IO与 NIO的区别? 常用io类有那些? 字节流与字符流的区别? 说说阻塞 IO 模型? 说说非阻塞 IO 模型? 说说多路复用 IO 模型? 说说信号驱 ...

  6. Java中的string定义的两种方法和区别

    java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...

  7. java中io流是类吗_Java中的IO流

    今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

  8. java中IO流详解

    不断更新中!!! 1.流的定义及分类 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输操作都是以"流"的方式进行.设备可以是文件,网络,内存等.将数据从 ...

  9. Java中IO流的分类和BIO,NIO,AIO的区别

    到底什么是IO 我们常说的IO,指的是文件的输入和输出,但是在操作系统层面是如何定义IO的呢?到底什么样的过程可以叫做是一次IO呢? 拿一次磁盘文件读取为例,我们要读取的文件是存储在磁盘上的,我们的目 ...

  10. java中io流,Reader和Writer,InputStream和OutputStream,转换流 InputStreamReader 和 OutputStreamWriter

    java中所谓流通俗来讲就是数据源的传输,我们的文件,视屏,对象都可以叫做数据源,io将他们那转换为可以在不同程序中传输的数据,众所周知电脑存储是二进制,而处理时常遇到字节和字符的写入和写出,分别以8 ...

最新文章

  1. React组件常用设计模式之Render Props
  2. 半小时训练亿级规模知识图谱,亚马逊AI开源知识图谱嵌入表示框架
  3. Atom:A hackable text editor for the 21st Century
  4. 数据库的小知识——主从架构
  5. oracle对比两列数据_oracle与mysql对同一张表 两列数据的某一字段进行值的交换
  6. 谈谈DictionaryT1,T2和ListT的问题
  7. iOS PUSH实现的简单步骤
  8. 深度学习入门:Day-12
  9. IE6下透明PNG图片的显示
  10. clock gate cell
  11. C# static变量、const变量、readonly变量
  12. laravel后台可修改配置自动加载
  13. win7打开xp共享的计算机,xp/win7局域网共享软件
  14. 《弃子长安》第六章 九煞夺命
  15. 【Matlab】 气候资料数据集预处理
  16. iphone屏幕尺寸总结
  17. 信息学奥赛一本通——2062:【例1.3】电影票
  18. 从实战学习微信小程序-电商星星评分功能(五)
  19. 小学生计算题软件产品设计
  20. linux--- 连接数据库

热门文章

  1. 程序员的自我修养_之二_曾国藩的“大悔大悟”
  2. 中国合成革行业应用发展分析与销售前景研究报告2022版
  3. 透透彻彻IoC(你没有理由不懂!)
  4. 仓管员的个人年终总结pos维护调度年终总结
  5. ppt编写一个抽奖系统_PPT抽奖程序
  6. 在浏览器输入url回车后发生了什么
  7. python实现指纹识别毕业论文_(完整版)指纹识别系统本科毕业论文
  8. linux绝育玩客云_玩机技巧 篇二:玩客云实用指南(真·无痛绝育),附玩物下载对比...
  9. 目标检测实战篇1——数据集介绍(PASCAL VOC,MS COCO)
  10. CSDN 空间:“迷你博客”很迷人(2)收藏