博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java缓冲流细节
阅读量:6427 次
发布时间:2019-06-23

本文共 1980 字,大约阅读时间需要 6 分钟。

FileOutPutStream继承OutputStream,并不提供flush()方法的重写所以无论内容多少write都会将二进制流直接传递给底层操作系统的I/O,flush无效果。而Buffered系列的输入输出流函数单从Buffered这个单词就可以看出他们是使用缓冲区的。应用程序每次IO都要和设备进行通信,效率很低,因此缓冲区为了提高效率,当写入设备时,先写入缓冲区,每次等到缓冲区满了时,就将数据一次性整体写入设备,避免了每一个数据都和IO进行一次交互,IO交互消耗太大。

使用flush()和不使用flush()效果对比

不使用flush()

String s = "Hello World";    try {      // create a new stream at specified file      PrintWriter pw = new PrintWriter(System.out);      // write the string in the file      pw.write(s);//            // flush the writer//            pw.flush();    } catch (Exception ex) {      ex.printStackTrace();    }输出:

buffer没有满,输出为空。

使用buffer()

String s = "Hello World";try {  // create a new stream at specified file  PrintWriter pw = new PrintWriter(System.out);  // write the string in the file  pw.write(s);  // flush the writer   pw.flush();} catch (Exception ex) {  ex.printStackTrace();}

得到期望的输出结果。

解析

close()和flush()作用有交集!

public static void main(String[] args) {     BufferedWriter fw =null;     try {       fw =  new BufferedWriter(new FileWriter("e:\\test.txt"));       fw.write("wo shi lucky girl.");       //fw.flush();       fw.close();     } catch (Exception e) {       e.printStackTrace();     }   }//fw.flush();这句有和无并不影响输出结果,不太明白词句是否必要?

因为close的时候,会把你没flush掉的一起flush掉。缓冲区中的数据保存直到缓冲区满后才写出,也可以使用flush方法将缓冲区中的数据强制写出或使用close()方法关闭流,关闭流之前,缓冲输出流将缓冲区数据一次性写出。在这个例子中,flash()和close()都使数据强制写出,所以两种结果是一样的,如果都不写的话,会发现不能成功写出

Java默认缓冲区大小是多少?

默认缓冲去大小8192字节。

实验

char[] array  = new char[8192];        Arrays.fill(array,'s');        PrintWriter pw = new PrintWriter(System.out);        pw.write(array);  output:      char[] array  = new char[8193];        Arrays.fill(array,'s');        PrintWriter pw = new PrintWriter(System.out);        pw.write(array);  output:    ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss..一共8193个s...sssssssssssssssssssssssssssssssssssssssssssssss

当设置数组长度为8192时没有输出,设置8193时有输出。

经典问题

数据重复问题

 

转载于:https://www.cnblogs.com/yw-ah/p/5865611.html

你可能感兴趣的文章
IOS 支付宝支付常见问题
查看>>
Git 环境变量配置
查看>>
有关字节序
查看>>
Idea插件
查看>>
AI考拉技术分享-Node基础架构专题(二)
查看>>
手机在于折腾,这下玩火自焚了...
查看>>
《工具 系列》 - Cmder
查看>>
android通过socket连接服务端(PC端)
查看>>
数据库 三大范式
查看>>
eclipse打不开
查看>>
NDK学习一: - 环境搭建
查看>>
怎样维护 SQLite
查看>>
Navicat for SQLite 索引的作用
查看>>
如何拯救交响乐团
查看>>
CALayer的常见应用
查看>>
使用rman恢复控制文件
查看>>
JNI_Java Native Interface
查看>>
Dreamweaver代码不自动提示的问题
查看>>
Hystrix入门研究
查看>>
CSS选择器兼容性列表
查看>>