在学习了《文件传输基础——Java IO流》 课程后,发现自己对flush()方法的调用有很多疑惑。在查询资料和自己看源码以及动手试验之后发现有以下几个特点。如有误也请大家指正出来,一切为了java,谢谢~

FileInputStream的 flush()是继承于其父类OutputStream的,但是OutputStream类的flush()什么都没做。

当OutputStream是BufferedOutputStream时,BufferedOutputStream中重写了flush()方法,并在其中调用了flushBuffer()方法以及OutputStream的flush()方法

public synchronized void flush() throws IOException {

flushBuffer();

out.flush(); //OutputStream

}

private void flushBuffer() throws IOException {

if (count > 0) {

out.write(buf, 0, count); //OutputStream,buf是缓冲区

count = 0;

}

}

3.而在BufferedOutputStream中 缓冲区buffer其实就是一个byte[],BufferedOutputStream的每一次write其实是将内容写入byte[],当buffer容量到达上限时,会触发真正的磁盘写入。

public synchronized void write(byte b[], int off, int len) throws IOException {

if (len >= buf.length) {

/* If the request length exceeds the size of the output buffer,

flush the output buffer and then write the data directly.

In this way buffered streams will cascade harmlessly. */

flushBuffer();

out.write(b, off, len);

return;

}

if (len > buf.length - count) {

flushBuffer();

}

System.arraycopy(b, off, buf, count, len); //写入缓冲区

count += len;

}

4.那么什么时候才需要调用flush()呢?

举个例子:

public static void main(String[] args) throws IOException {

File demo = new File("demo");

if(!demo.exists()){

demo.mkdir();

}

File file = new File(demo, "raf.dat");

if(!file.exists()){

file.createNewFile();

}

PrintWriter pw = new PrintWriter(file);

String s = "";

for(int i = 0;i<2000;i++){

s="我是要写入到记事本文件的内容"+i;

pw.write(s);

}

pw.close();

}

在这段代码中,加了pw.close() ,可以完整的输出到“我是要写入到记事本文件的内容1999”。而不加pw.close(),在输出“我是要写入到记事本文件的内容1804”时,输出不完整了,1804接下来的字符串也被丢弃了(这是因为1804到1999这部分没有填满缓冲区)。如果将pw.close()替换成pw.flush()也可以进行完整的输出(这只是测试,正式使用时别忘了加将pw.close())。

也就是close()时会自动flush,在不调用close()的情况下,缓冲区不满,又需要把缓冲区的内容写入到文件或通过网络发送到别的机器时,才需要调用flush();

(这种情况适用于字节流:BufferedOutputStream,字符流的大部分Writer类(是不是全部我没有去验证),本质上只要在某类及其父类中有定义缓冲区的都适用。)

而FileOutputStream及其父类没有缓冲区,即在使用时不需要调用flush()。

感谢作者cmoaciopm 的博客《对OutputStream类的flush()方法的误解》给我带来的思路!

java io flush_《文件传输基础——Java IO流》,对其中flush方法的思考相关推荐

  1. 文件传输基础——Java IO流

    一.文件的编码 1 package com.study.io; 2 3 4 /** 5 * 测试文件编码 6 */ 7 public class EncodeDemo { 8 9 /** 10 * @ ...

  2. Java Socket实现文件传输

    阿里云双11服务器优惠(年度最佳优惠): A:1核2GB 1M 服务器年69元 B:1核2GB 1M 服务器三年180元 C:2核4GB 1~10M 服务器三年567元(强烈推荐) D:4核8GB 1 ...

  3. 服务器测试文件怎么创建,如何创建一个“FTPS”模拟服务器以单元测试Java中的文件传输...

    我有一个创建FTPS连接的CreateFTPConnection类.使用此连接传输文件.这里是TransferFile类的代码如何创建一个"FTPS"模拟服务器以单元测试Java中 ...

  4. java qq 传送文件_如何利用Java实现QQ文件传输功能.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspJava 如何利用Java实现QQ文件传输功能.pdf2页 本文 ...

  5. java学习笔记:零基础java学习路线+配套资料+书籍推荐

    公众号菜鸟名企梦2018年,精品文章汇总: 01 我的秋招 我的秋招offer 我的offer选择 秋招全面总结-必读宝典 求职必读 02 零基础学习路线 零基础-java学习路线(上) 零基础-ja ...

  6. java io 创建文件夹_Java中Io流操作-File类的常用操作-创建文件,创建文件夹

    package com.hxzy.IOSer; import java.io.File; import java.io.IOException; public class Demo03 { publi ...

  7. java线程删除文件,线程“main”java.io.jgitinernalexception中的异常:无法删除临时文件c:\users\13 dec...

    我正在尝试使用jgit克隆git存储库. public static void main(String[] args) throws IOException, InvalidRemoteExcepti ...

  8. Java基于Socket文件传输示例(转)

    最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...

  9. Java基于Socket文件传输示例

    这个实例中的socket文件传输采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出流进行包装,加快传输的速度. 先来看服务器端的程序. 1.服务器端 import java.io.Buffere ...

最新文章

  1. 多项式加法C语言_只愿与一人十指紧扣_新浪博客
  2. LeetCode--046--全排列(java)
  3. Java社区领袖介绍平台支持选项
  4. 230. Kth Smallest Element in a BST ——迭代本质:a=xx1 while some_condition: a=xx2
  5. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积计算案例二 | 计算 卷积 )
  6. 用户资源管理DBMS_RESOURCE_MANAGER
  7. QTP、LoadRunner、QC工具下载地址
  8. 42. 接雨水 golang
  9. 基于java员工管理系统设计(含源文件)
  10. php post请求 下载文件,POST请求 下载文件
  11. orange实现逻辑回归_逻辑回归模型
  12. 丹麦为NSA开绿灯 通过通信中心监控欧洲政客
  13. oracle快速创建可用用户
  14. windows配置caffe及matlab/python接口编译和调用(cpu/gpu)
  15. 你家的猫也能来段东北话了:快手快影一键「智能配音」,三种方言随意换,还能配出《舌尖》风...
  16. 2022年PC必备的5款软件,功能强大且免费,你用过几个?
  17. BIOS int 10H中断介绍
  18. 怎样在python安装open cv_python 安装+open cv
  19. 安全分析--追踪溯源的找人思路
  20. LSTM-长短时记忆网络

热门文章

  1. OpenShift 4 - Pod的亲和性/反亲和性
  2. OpenShift 4 - 设置集群节点和Pod容器的时间和时区
  3. WPF:DataGrid可过滤、多语言
  4. Debian 26 岁生日快乐!Happy DebianDay!
  5. 实现机器学习的循序渐进指南V——支持向量机
  6. 初学者的持续集成和交付(DevOps)
  7. 谷歌开源 TensorFlow 的简化库 JAX
  8. php多个逻辑如何分为多个逻辑块,php 项目如何分层
  9. ad中那个快捷键是重复上一部_Excel中的F4快捷键用的好,告别加班没烦恼!
  10. ios 从服务器获取文件,ios - 如何将远程文件(从远程SMB服务器获取)提供给某些请求 - 堆栈内存溢出...