深入理解Java IO的flush

作者:laozhang 时间:2022-01-02 20:05:53 

Java的IO是一个大知识点,

如果把它的知识点拆开来说的话估计能说一个星期,关于IO的体系可以看看下面这张图,

深入理解Java IO的flush

接下来我们从一段代码开始聊吧,先看看下面这段代码


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()这个东西,其实在很久以前的网络传输中就有了

那个时候为了效率,服务器和客户端传输数据的时候不会每产生一段数据就传一段数据

而是会建一个缓冲区,在缓冲区满之后再往客户端传输数据

深入理解Java IO的flush

有时候会有这样的问题,当数据不足以填充缓冲区,而又需要往客户端传数据,为了解决这个问题,就有了 flush的概念,将缓冲区的数据强迫发送。

回到上面的问题,如果把 flush换成 close是否可行呢

答案是可以的。

如果看源码就知道 BufferedOutputStream的继承关系


public class BufferOutputStream extends FilterOutputStream

BufferedOutputStream没有实现 close()方法,所以会直接调用 FilterOutputStream的 close(),而 FilterOutputStream的 close()方法会调用 flush()来输出缓冲区数据。

实际开发中关于IO操作的,都强调最后要调用 close()方法,上面的例子就是其中一个原因了。

标签:Java,IO,flush
0
投稿

猜你喜欢

  • 使用Java反射模拟实现Spring的IoC容器的操作

    2023-06-03 17:37:42
  • Java基于rest assured实现接口测试过程解析

    2022-07-25 09:30:25
  • Java IO流—异常及捕获异常处理 try…catch…finally

    2023-03-14 07:35:52
  • 详解Spring Boot集成MyBatis(注解方式)

    2023-10-03 17:45:47
  • Java使用Apache.POI中HSSFWorkbook导出到Excel的实现方法

    2022-05-24 17:14:13
  • 深入浅析Java 抽象类和接口

    2022-12-17 19:19:27
  • C语言程序设计50例(经典收藏)

    2023-07-10 08:33:19
  • java json 省市级联实例代码

    2021-11-13 18:50:35
  • 详解SpringMVC常用注解功能及属性

    2021-12-29 02:49:23
  • java中断线程的正确姿势完整示例

    2023-01-27 06:33:58
  • Java中Controller、Service、Dao/Mapper层的区别与用法

    2022-09-12 15:14:03
  • Spring中自动装配的4种方式

    2021-08-01 16:44:41
  • Java遗传算法之冲出迷宫

    2022-01-12 21:34:58
  • Java编程实现非对称加密的方法详解

    2023-08-24 01:21:26
  • Java Runnable和Thread实现多线程哪个更好你知道吗

    2021-08-17 05:48:50
  • SpringMVC实现文件上传下载的全过程

    2023-04-05 21:16:52
  • Spring+SpringMVC+MyBatis深入学习及搭建(一)之MyBatis的基础知识

    2021-09-27 15:12:59
  • java之CSV大批量数据入库的实现

    2021-06-30 15:53:49
  • spring boot中使用@Async实现异步调用任务

    2023-04-25 13:35:18
  • 快速排序算法在Java中的实现

    2022-05-25 01:06:15
  • asp之家 软件编程 m.aspxhome.com