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时有输出。

经典问题

数据重复问题

Java缓冲流细节的更多相关文章

  1. java 缓冲流 Buffer

    缓冲流 Buffer :设置缓冲区加快执行效率 子类: (一)BufferedInputStream : 缓冲输入字节流 ,目的:提高读取文件的效率  注意: BufferedInputStream ...

  2. Java缓冲流高效大文件的复制实例

    public class BufferedDemo { public static void main(String[] args) throws FileNotFoundException { // ...

  3. Java缓冲流的优点和原理

    不带缓冲的流的工作原理: 它读取到一个字节/字符,就向用户指定的路径写出去,读一个写一个,所以就慢了. 带缓冲的流的工作原理: 读取到一个字节/字符,先不输出,等凑足了缓冲的最大容量后一次性写出去,从 ...

  4. java 缓冲流

    english.txt The arrow missed the target. They rejected the union demand. Where does this road go to? ...

  5. Java缓冲流写出数据实例

    public class BufferedWriterDemo throws IOException { public static void main(String[] args) throws I ...

  6. java的 IO流之缓冲流(转载)

    java缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装.当对文件或其他目标频繁读写或操作效率低,效能差.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来 ...

  7. java IO之 File类+字节流 (输入输出 缓冲流 异常处理)

    1. File类

  8. JAVA基础学习day20--IO流二-缓冲流、字节流

    一.缓冲流 1.1.字符流的缓冲区 缓冲区的出现是为了提高IO的读写效率 对应类 BufferedReader BufferedWriter 缓冲区要结合流才可以使用 在流的基础上对流的功能进行了增强 ...

  9. java 21 - 6 字符缓冲流的特殊方法以及该方法高效复制文件

    字符缓冲流的特殊方法: A.BufferedWriter: public void newLine():根据系统来决定换行符 private static void write() throws IO ...

随机推荐

  1. Arrays.asList(数组) 解说

    最近在用Arrays的asList()生成的List时,List元素的个数时而不正确. Java代码 一:Arrays.asList(数组)该方法是将数组转化为集合(该方法主要用于Object对象数组 ...

  2. React 初探

    React 简单介绍 先说 React 与 React Native 他们是真的亲戚,可不像 Java 和 Javascript 一样. 其实第一次看到 React 的语法我是拒绝的,因为这么丑的写法 ...

  3. 021ARM处理器工作模式

    1.User模式:usr,普通应用程序运行的模式: 2.FIQ模式:fiq,快速中断模式,当一个程序正在运行时,突然产生一个中断,而且这种中断属于快速中断,那么将进入快速中断模式下运行: 3.IRQ模 ...

  4. Html辅助方法(分页、下拉框)

    引用命名空间: using System.Text; using System.Web.Mvc; Html分页方法 #region 分页Html辅助方法 /// <summary> /// ...

  5. 百度搜索API v3版本与soap

    技术文档请参考http://dev2.baidu.com/docs.do?product=2#page=File,和http://dev2.baidu.com/docs.do?product=2#pa ...

  6. win7修改软件【授权给…】后面的名称

    很简单,按下图打开注册表,修改: Ctrl+F分别搜索以下三个键值,搜到后修改为你想显示的名称即可即可. 1:UserName 2:RegisteredOrganazition 3:Registere ...

  7. 雷达装置 (POJ 1328/ codevs 2625)题解

    [问题描述] 假定海岸线是一条无限延伸的直线,陆地在海岸线的一边,大海在另一侧.海中有许多岛屿,每一个小岛我们可以认为是一个点.现在要在海岸线上安装雷达,雷达的覆盖范围是d,也就是说大海中一个小岛能被 ...

  8. STM32F0xx_看门狗(独立+窗口)配置详细过程

    Ⅰ.概述 对于看门狗,我觉得做单片机或者嵌入式开发的人员来说并不陌生,今天总结STM32F0看门狗的功能,F0的看门狗有两种:独立和窗口看门狗. 今天提供两种看门狗的软件工程实例,供大家下载. 两种看 ...

  9. S3C2440 LCD驱动(FrameBuffer)实例开发<一>(转)

    1. 背景知识 在多媒体的推动下,彩色LCD越来越多地应用到嵌入式系统中,PDA和手机等大多都采用LCD作为显示器材,因此学习LCD的应用很有实际意义! LCD工作的硬件需求:要使一块LCD正常的显示 ...

  10. wpf 获取DataGrid某一个单元格,设置此单元格ToolTip内容和背景颜色

    public void GetCell()        {            for (int i = 0; i < this.datagrid1.Items.Count; i++)    ...