深入理解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()方法,上面的例子就是其中一个原因了。

(0)

相关推荐

  • Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写出,也可以使用flush方法将缓冲区中的数据强制写出或使用close()方法关闭流,关闭流之前,缓冲输出流将缓冲区数据一次性写出.flash()和close()都使数据强制写出,所以两种结果是一样的,如果都不写的话,会发现不能成功写出 针对上述回答,给出了精准的回答 FileOutPutStream

  • Java IO创建目录和文件实例代码

    我们先来看下具体代码: import java.io.File; import java.io.IOException; public class CreatFile{ public static void main(String[] args) { File newDir=new File("D:/test"); //声明磁盘目录 File newFile = new File(newDir,"test.txt"); //声明目录文件 boolean newCre

  • java关闭流连接IO工具类

    本文实例为大家分享了java关闭流连接IO工具类的具体代码,供大家参考,具体内容如下 package com.demo.utils; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; /** * 关闭流连接IO工具类 * @author dongyangyang * @Date 2016

  • 代码实例Java IO判断目录和文件是否存在

    我们先来看完整的代码: import java.io.File; public class JudgeFile { public static void main(String[] args) { File dir = new File("D:/"); //声明D磁盘 File file = new File(dir,"test"); //声明D磁盘根目录下名为test的文件 boolean d=dir.exists(); boolean f=file.exists

  • Java IO文件后缀名过滤总结

    实现效果:列出某个目录下的特定后缀名文件(如,列出D盘根目录下txt后缀的文件) import java.io.File; import java.io.FilenameFilter; public class QueryFile implements FilenameFilter{ String extension; //文件扩展名 public QueryFile(String extension){ this.extension="."+extension.toLowerCase

  • 浅析Java IO相关知识点

    最近面试问的比较多的问题就是IO这一块了,有些也答出来了,有些答的不好,最近这段时间开始深入了解一些这方面的东西,也想总结一下. 前置点 1,用户空间系统空间 Linux系统会把一个进程分为两个空间,用户空间和系统空间,比如我们正常的编码,操作的都是用户空间的,那如果我们需要调用系统功能,比如拷贝系统文件,这种就需要调用系统组件,获取内核服务,完成操作 IO的两个阶段 IO的执行过程中分为两个阶段,等待就绪,执行拷贝 等待就绪:我们知道,我们执行IO操作的时候,数据可能来自别的应用程序或者网络,

  • JAVA8如何妙用Optional解决NPE问题详解

    引言 NPE(NullPointerException)是调试程序最常见的异常.google一下有很多关于方法到底应该返回null还是new一个空对象的讨论. 在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user.getAddress().getProvince(); 这种写法,在user为null时,是有可能报NullPointerException异常的

  • 深入理解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(); } FileOu

  • IO中flush()函数的使用代码示例

    The java.io.Writer.flush() method flushes the stream. If the stream has saved any characters from the various write() methods in a buffer, write them immediately to their intended destination. Then, if that destination is another character or byte st

  • Java IO流深入理解

    目录 阻塞(Block)和非阻塞(Non-Block) 同步(Synchronization)和异步(Asynchronous) BIO与NIO对比 面向流与面向缓冲 阻塞与非阻塞 选择器的问世 Java NIO三件套 缓冲区Buffer Buffer的基本的原理 缓冲区分配 选择器Selector 通道Channel 使用NIO读取数据 使用NIO写入数据 IO多路复用 总结 阻塞(Block)和非阻塞(Non-Block) 阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,

  • java IO 字节流详解及实例代码

    java IO 字节流详解 1.         如何理解输入输出流? 这是我当初在学习Java IO这一块很难理解的一块,输入输出流我们可必须以一个为参照物:我们以内存为参照物,凡是写入内存的我们叫输入流,从内存中写出的我们叫输出流.看下面的示例图 有了这样的一个概念对于我们再学习Java中的IO流我相信就会变得特别简单了. 2.         再看流的分类 流的分类,Java的流分类比较丰富,刚接触的人看了后会感觉很晕.流分类的方式很多: 1.按照输入的方向分,输入流和输出流,输入输出的参

  • 【Java IO流】字节流和字符流的实例讲解

    字节流和字符流 对于文件必然有读和写的操作,读和写就对应了输入和输出流,流又分成字节和字符流. 1.从对文件的操作来讲,有读和写的操作--也就是输入和输出. 2.从流的流向来讲,有输入和输出之分. 3.从流的内容来讲,有字节和字符之分. 这篇文章先后讲解IO流中的字节流和字符流的输入和输出操作. 一.字节流 1)输入和输出流 首先,字节流要进行读和写,也就是输入和输出,所以它有两个抽象的父类InputStream.OutputStream. InputStream抽象了应用程序读取数据的方式,即

  • JAVA IO API使用详解

    一.理论准备流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以"流"的方式进行,设备可以是文件.网络.内存等.流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序(小马哥说的是机器)为参考,如果数据的流向是程序至设备,我们成为输出流,反之我们称为输入流,可以将流想象成一个"水流管道"(很多资料都这么讲的),自然就出现了方向的概念.流把I/O设备内部的具体操作给隐藏起来了.所有InputStream和Reader的派

  • 全面总结java IO体系

    1.Java Io流的概念,分类,类图. 1.1 Java Io流的概念 java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作.在java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为"流"(stream).通过流的形式允许java程序使用相同的方式来访问不同的输入/输出源.stram是从起源(source)到接收的(sink)的有序数据. 注:java把所有的传统的流类型都放到在java io包下,用于实现输入和输出功能. 1.2 Io流的分类: 按照

  • java IO流文件的读写具体实例

    引言: 关于java IO流的操作是非常常见的,基本上每个项目都会用到,每次遇到都是去网上找一找就行了,屡试不爽.上次突然一个同事问了我java文件的读取,我一下子就懵了第一反应就是去网上找,虽然也能找到,但自己总感觉不是很踏实,所以今天就抽空看了看java IO流的一些操作,感觉还是很有收获的,顺便总结些资料,方便以后进一步的学习... IO流的分类:1.根据流的数据对象来分:高端流:所有的内存中的流都是高端流,比如:InputStreamReader  低端流:所有的外界设备中的流都是低端流

  • 深入理解Java 对象和类

    Java作为一种面向对象语言.支持以下基本概念: •多态 •继承 •封装 •抽象 •类 •对象 •实例 •方法 •消息解析 本节我们重点研究对象和类的概念. •对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. •类:类是一个模板,它描述一类对象的行为和状态. Java中的对象 现在让我们深入了解什么是对象.看看周围真实的世界,会发现身边有很多对象,车,狗,人等等.所有这些对象都有自己的状态和行为. 拿一条狗来举例,它的状态有

  • Java IO文件编码转换实现代码

    对IO操作真心不是很懂...对编码.乱码也是一知半解...今天遇到了一个需求,要求将一个文件进行编码转换,并且返回编码后的字符串,如原本的GBK编码,转换为UTF-8 其中这个BytesEncodingDetect 类就不贴了.主要用了里面的获取文件编码格式. 刚开始试了直接在源文件修改编码方式,采用URLEncoder和URLDecoder进行转换,却迟迟不行.出现了中文奇数最后一个字乱码 百度找了解决方法,都未果,只好采用我的思路是:先读取源文件的内容,存放到StringBuffer里面,然

随机推荐