深入理解Java IO的flush
作者:laozhang 发布时间:2022-01-02 20:05:53
标签: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()方法,上面的例子就是其中一个原因了。


猜你喜欢
- 1.短信平台购买次数地址https://market.aliyun.com/products/57000002/cmapi00046920.
- checkbox控件时导致Activity启动默认不显示输入法。网上很多资料说要放一个空的Linearlayout,完全是在误导大众,正确的
- 本文实例讲述了C#中的事务用法。分享给大家供大家参考。具体如下:直接用SQL语句创建事务, 当然不是什么稀奇事了, 好是好, 只是麻烦.看看
- 1.添加命名空间System.IO;System.Text;2.文件的读取(1).使用FileStream类进行文件的读取,并将它转换成ch
- swing自带的窗体是不能够满足我们的应用需求的,所以需要制作任意图片和形状的JFrame框体,比如下图:并且可以设置窗体背景图片的透明度下
- 首先添加一个timer,50susing System;using System.Collections.Generic;using Sys
- 目标:了解Swagger的作用和概念了解前后端分离在springBoot中集成SwaggerSwagger简介前后端分离VUE+spring
- 实现的效果图:代码实现:tv = (TextView) findViewById(R.id.tv);String a = "有2年
- 最近由于参加一个小小的创意比赛,用安卓做了一个小小的图片识别应用,主要是通过拍照识别图片中的菜品,还有对象位置查找的东西。之前没有做过安卓,
- 昨天给各位总结了本人学习springboot整合mybatis第一阶段的一些学习心得和源码,主要就算是敲了一下SpringBoot的门儿,希
- 本文实例为大家分享了android实现简易计算器展示的具体代码,供大家参考,具体内容如下效果图:一、如图,首先布局计算器主页显示activi
- 以下将是 C# 7.0 中所有计划的语言特性的描述。随着 Visual Studio “15” Preview 4 版本的发布,这些特性中的
- 一、概述本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。Optional 是 Java 实现函
- 解决问题:我在做移动端accessToken的使用遇到一个问题,就是普通类死活注入不进去spring bean,我和同事雷杰通过各种注解,x
- 在Android中通过ListView显示SD卡中的文件列表一共有两种方法,一是:通过继承ListActivity显示;二是:利用BaseA
- 本文实例为大家分享了Android使用GridView实现横向滚动效果的具体代码,供大家参考,具体内容如下第一次做横向滑动,看了一些列子,基
- 今天闲来无事写了一个清内存的小东西,类似360,在桌面上悬浮,点击后清除后台无用程序,清除后台程序是通过调用ActivityManger.k
- 反射和配置文件学习 Spring 的时候,虽然可以知道是通过反射和配置文件的方式来获取 JavaBean 对象,但是一直没有机会自己尝试一次
- File 类:文件和目录路径名的抽象表示。注意:File 类只能操作文件的属性,文件的内容是不能操作的。1、File 类的字段我们知道,各个
- 线程中断:void interrupted()方法:中断线程,例如,当线程A运行时,线程B可以调用线程A的interrupted()方法来设