深入理解Java IO的flush

 更新时间:2018年06月14日 08:12:00   投稿:laozhang  
本篇文章是小编总结的关于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()方法,上面的例子就是其中一个原因了。

相关文章

  • Java连接sftp服务器实现上传下载功能

    Java连接sftp服务器实现上传下载功能

    这篇文章主要介绍了java连接sftp服务器实现上传下载,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Java中HashMap和Hashtable的区别浅析

    Java中HashMap和Hashtable的区别浅析

    这篇文章主要介绍了Java中HashMap和Hashtable的区别浅析,本文总结了6条它们之间的不同之处,需要的朋友可以参考下
    2015-03-03
  • SpringBoot后端接口的实现(看这一篇就够了)

    SpringBoot后端接口的实现(看这一篇就够了)

    这篇文章主要介绍了SpringBoot后端接口的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java索引越界异常Exception java.lang.IndexOutOfBoundsException的解决

    Java索引越界异常Exception java.lang.IndexOutOfBoundsException

    本文主要介绍了Java索引越界异常Exception java.lang.IndexOutOfBoundsException的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • JAVA如何定义构造函数过程解析

    JAVA如何定义构造函数过程解析

    这篇文章主要介绍了JAVA如何定义构造函数过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • java多次嵌套循环查询数据库导致代码中数据处理慢的解决

    java多次嵌套循环查询数据库导致代码中数据处理慢的解决

    这篇文章主要介绍了java多次嵌套循环查询数据库导致代码中数据处理慢的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • SpringBoot整合邮件发送的四种方法

    SpringBoot整合邮件发送的四种方法

    这篇文章主要介绍了SpringBoot整合邮件发送的四种方法,SpringBoot中集成了发送邮件的功能,本文做了进一步优化,需要的朋友可以参考下
    2023-03-03
  • 使用filebeat收集并解析springboot日志过程示例

    使用filebeat收集并解析springboot日志过程示例

    这篇文章主要为大家介绍了使用filebeat收集并解析springboot日志实现过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Spring MVC 处理一个请求的流程

    Spring MVC 处理一个请求的流程

    Spring MVC是Spring系列框架中使用频率最高的部分。不管是Spring Boot还是传统的Spring项目,只要是Web项目都会使用到Spring MVC部分。因此程序员一定要熟练掌握MVC部分。本篇博客简要分析Spring MVC处理一个请求的流程。
    2021-02-02
  • Java有效处理异常的三个原则

    Java有效处理异常的三个原则

    Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮、易于调试。那么这篇文章总结了Java有效处理异常的三个原则,有需要的朋友们可以参考借鉴。
    2016-09-09

最新评论