Java中IO流-18-flush和close方法的区别_flush close-程序员宅基地

技术标签: Java基础-异常/IO/File/多线程-学习笔记  flush和close的区别  

    本篇来学习一个小的知识点,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,就会报已经关闭了流,不能再对流进行操作的错误。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011541946/article/details/81150610

智能推荐

DataGridView中DataGridViewComboBoxColumn的一些相关应用(一)让其值改变时触发事件_datagridview commitedit-程序员宅基地

文章浏览阅读3.8k次。 今天在csdn回一个帖子的时候看到一个DataGridView问题,需要触发DataGridViewComboBoxCell中的事件才能够解决. 打开vs试了下没有找到能直接触发DataGridViewComboBoxCell中combobox的值改变的事件,郁闷了半天,仔细看MSDN上有解决示例,都怪自己没有仔细看:首先需要触发第一个事件:CurrentCellDirtyStateCh_datagridview commitedit

Apollo详解之定位模块———导航设备硬件基础_gpchc-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏22次。本文以华测CHC CGI-610组合导航为例主机安装方法在实际安装时,主机的GNSS1、GNSS2、4G接口分别通过数据线连接两个GNSS天线、4G天线,最后一个COM接口连接数据线,用于连接工控机以及外接电源。数据线接口定义19PIN 数据线主要包括 3 个 RS232,1 个 RS422,1 个 CAN,一个电源口,其中C_RS232:可通过网页配置选择输出组合导航融合数据(包括 GPCHC、GPGGA、GPRMC),最高输出频率 100HZ,默认波特率 230400,其与工控机连接。_gpchc

python代码实现MATLAB里面的高斯Q函数qfunc以及高斯Q函数的反函数qfuncinv_matlab q函数-程序员宅基地

文章浏览阅读956次。【代码】python代码实现MATLAB里面的高斯Q函数qfunc以及高斯Q函数的反函数qfuncinv。_matlab q函数

hadoop启动命令 start-all.sh失效解决办法_hduser@hduser-virtualbox:~$ start-all.sh this scri-程序员宅基地

文章浏览阅读3.8w次,点赞9次,收藏35次。很多人在配置好了hadoop集群后,输入启动命令 start-all.sh 时,报错:This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh 如下:hadoop@master:~/hadoop-2.6.4$ start-all.shThis script is Deprecated. Inste_hduser@hduser-virtualbox:~$ start-all.sh this script is deprecated. instead

15.Mybatis 更新操作-update_update mybatis-程序员宅基地

文章浏览阅读7.5w次,点赞17次,收藏37次。1. update 标签update 标签是用于定义更新 语句的.1.1 常用属性update 有几个常用的属性, 但是通常只需要设置id 即可.id: sql 片段在命名空间内的唯一标识. 和mapper 中方法名保持一致parameterType: 参数类型, 通常都可以省略.flushCache: 是否刷新(清空)一级缓存和二级缓存, 默认为true. 笔者尝试设置为false..._update mybatis

android bitmap 保存到本地_Android全屏截图的方法,返回Bitmap并且保存在SD卡上-程序员宅基地

文章浏览阅读208次。今天做分享,需求是截图分享,做了也是一个运动类的产品,那好,我们就直接开始做,考虑了一下,因为是全屏的分享,所有很自然而然的想到了View的getDrawingCache()方法来获取Bitmap,看到网上有人说截取不了WebView上的图片,倒是没有去尝试,因为我们的应用不需要,不过有时间还是要去试试,占占坑,这篇博客只是记录一下知识点,没什么技术含量我们写个小Sample就好了activity..._net android.graphics.bitmap 保存

随便推点

“Unknown initial character set index '255' received from serve”错误解决过程 - Mybatis 示例_unknown initial character 255-程序员宅基地

文章浏览阅读4.7k次,点赞8次,收藏13次。今天在学习Mybaits的时候,根据教程写出了一个第一个程序——从数据库读取一条数据并打印。当一切都就绪了:user.javaUserMapper.xmlmybatis-config.xml测试类依葫芦画瓢地写下来,以为没问题了,运行这个测试方法,竟然报错了:org.apache.ibatis.exceptions.PersistenceException: ### Err..._unknown initial character 255

[附源码]JAVA+ssm校友信息管理系统(程序+Lw)_java校友信息管理系统-程序员宅基地

文章浏览阅读307次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:SSM + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;_java校友信息管理系统

linux网络编程之socket编程(三)-程序员宅基地

文章浏览阅读94次。今天继续对socket编程进行学习,在学习之前,需要回顾一下上一篇中编写的回射客户/服务器程序(http://www.cnblogs.com/webor2006/p/3923254.html),因为今天的知识点需要基于它来进行说明,下面来回顾一下关键代码:对于服务器端:echosrv.c对于客户端:echocli.c下面通过一个简单的图来描述一下其关系:可想而知,这两个套接字都有..._if (connect(sock, (struct sockaddr*)(&addr), sizeof(addr))

magic4.0跟harmonyos,支持升级Harmony 2.0 Magic UI 4.0 9月中旬招募公测-程序员宅基地

文章浏览阅读1.4k次。Magic UI 4.0系统将于9月中旬开始招募公测,适配荣耀30系列以及荣耀V30系列产品,后续同样支持升级为HarmonyOS 2.0系统。【PChome手机频道资讯报道】9月10日,华为开发者大会(HDC 2020)正式召开,正式推出HarmonyOS 2.0与EMUI 11操作系统。与此同时,荣耀在微博官宣,Magic UI 4.0系统也将于9月中旬开始招募公测,Magic UI 4.0广..._magicui4什么时候升的

关于启动报错:Field xxxMapper in com.xxx.service.impl.xxxServiceImpl required a bean of type的解决方案_field teachermapper in com.example.itextdemo.servi-程序员宅基地

文章浏览阅读3w次,点赞14次,收藏8次。检测你的启动类Application的MapperScan注解扫描是否配置正确!_field teachermapper in com.example.itextdemo.service.impl.eduteacherservicei

win7成功下编译VLC1.0.5-程序员宅基地

文章浏览阅读64次。想用最新版本的VLC 于是编译1.0.5版本由于有了前面的基础只需要以下几步就OK:关于修改1. 很多人提示的修改libtool第144行。--我的144行不是blank ,so没有更改;22) 注释掉Makefile.am第697,727,738行,就是行首加入#。#cp "$(top_srcdir)/extras..._vlc-1.0.5-win32.exe

推荐文章

热门文章

相关标签