在学习了《文件传输基础——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 的博客分享(感谢是感谢,但是我不是直接copy的呀。。。我要申请原创。。。)

java outputstream flush_对OutputStream类的flush()方法的误解相关推荐

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

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

  2. Java中Date和Calender类的使用方法

    查看文章     Java中Date和Calender类的使用方法 2009-10-04 20:49 Date和Calendar是Java类库里提供对时间进行处理的类,由于日期在商业逻辑的应用中占据着 ...

  3. java bufferedread_java中关于bufferedreader类中read方法

    java中关于bufferedreader类中read方法 关注:58  答案:2  mip版 解决时间 2021-01-14 05:40 提问者孤城古巷 2021-01-13 06:28 如下.此时 ...

  4. [ 转载 ] Java基础10--关于Object类下所有方法的简单解析

    关于Object类下所有方法的简单解析 类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直 ...

  5. Java常见面试题—Object 类中的方法

    Object 类中的方法 Object() 默认构造方法 clone() 创建并返回此对象的一个副本. equals(Object obj) 指示某个其他对象是否与此对象"相等". ...

  6. java mybatis enum_mybatis处理枚举类的简单方法

    mybatis自带对枚举的处理类 org.apache.ibatis.type.EnumOrdinalTypeHandler :该类实现了枚举类型和Integer类型的相互转换. 但是给转换仅仅是将对 ...

  7. java file_java开发之File类详细使用方法介绍

    File类简介 在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象.File 类定义了一些与平台无关的方法来操作文件,File类主要用来获取或处理与磁盘文件相关的信息,像 ...

  8. java file用法_Java File 类的使用方法详解(转)

    转自:http://www.codeceo.com/article/java-file-class.html Java File类的功能非常强大,利用Java基本上可以对文件进行所有的操作.本文将对J ...

  9. Java 8 新特性 Stream类的collect方法

    1.Collectors.toList():转换成List集合./ Collectors.toSet():转换成set集合. System.out.println(Stream.of("a& ...

最新文章

  1. php endall(),ob_end_flush
  2. matlab 矩阵位移法编程 结构力学,matlab 矩阵位移法编程 结构力学
  3. (草稿)如何判断一名UiPath开发人员是否合格?
  4. Ubuntu10.10 Server+Nginx+Django+Postgresql安装步骤
  5. 安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)
  6. 韦东山嵌入式学习视频完整目录
  7. 逻辑思维训练500题及答案
  8. Java笔记——关于设置自定义字体、全局字体方面和getFont()的使用
  9. matlab实现jpg图片转gif
  10. Linux操作系统主机名(hostname)简介
  11. Volatility3内存取证工具使用详解
  12. ddl是什么意思网络语_大学赶ddl是什么意思?DDL语句有什么功能?
  13. python异步处理请求_python:tornado+wsgi异步处理请求
  14. 必须来GeekPwn的十大理由
  15. 有关获取android唯一识别号IMEI的问题
  16. 三维形体投影面积(java)
  17. 零基础请进,影视解说必备的5个工具|不可错过的免费配音软件
  18. 郝健: Linux内存管理学习笔记-第3节课
  19. TiDB 6.0 新特性
  20. 上海科技大学计算机本科2020,上海科技大学2020年本科招生简章

热门文章

  1. 什么是PDCA循环管理
  2. AVC 报错问题示例以及解决方案
  3. 打造专利信息检索平台 服务创新型国家建设
  4. 使用宏设置word中的表格样式
  5. 2023 食物卡路里查询API接口源码
  6. 中国李宁重返纽约时装周,发布2019秋冬新品
  7. 三分钟教你读懂票据是什么
  8. 卜若的代码笔记系列-unity系列-第一章:json-5001
  9. 二叉排序树的删除,全网最详解析
  10. Base64与BLOB互相转换