1.什么是缓冲流?

缓冲流也称为处理流,对文件或者其他目标频繁的操作,效率低,性能差。缓冲流目的是提高程序读取和写出的性能。缓冲流也分为字节缓冲流(如FileInputStream与FileOutputStream)和字符缓冲流(如FileReader与FileWriter)

2.缓冲流的作用是?

先假设我们不用缓冲流时的情况:

package com.zhan;

import java.io.FileInputStream;
import java.io.IOException;

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

        FileInputStream fileInputStream = new FileInputStream("working.txt");
        byte[] bytes = new byte[fileInputStream.available()];
        fileInputStream.read(bytes);
        System.out.println(fileInputStream.available());
        String s = new String(bytes);
        System.out.println(s);
        fileInputStream.close();

    }
}

上述程序中,当我们通过字节输入流FileInputStream读取文本文件“working.txt“中的内容时,我们要通过byte数组作为缓冲,将我们调用read方法得到的相应字节存储到byte数组中,之后再传入String的构造参数中,才能显式返回文本里的相应内容。

而缓冲流的基本原理,是创建流对象时候,会创建一个内置的默认大小的缓冲区数组,通过缓冲区书写.使得性能大大提升。

3.使用方法

package com.zhan02;

import java.io.*;

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

        FileOutputStream fileOutputStream = new FileOutputStream("working.txt",true);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        bufferedWriter.write("追加成功!");
        bufferedWriter.flush();

        bufferedWriter.close();

    }
}

上述例子可以看到,我们一共创建了三个IO流对象:分别是FileOnputStream、OutputStreamWriter和BufferedWriter。其中FileOnputStream类用来指向working.txt文本,构造方法里的true表示当进行写入是以追加形式写入(即新写入内容不会覆盖原内容);OutputSteamWriter用于从字节流转换到字符流;而BufferWriter就是属于字符型的缓冲流,可以看到,其构造参数内部传入的是FileOutputStream的对象,表示属于FileOutputStream的缓冲。

完成上述创建过程后,一系列读写操作控制权就从原本的FileOutputStream对象转给了BufferedWriter对象了.

像上面的,具体指向文本内容而创建的流属于节点流(如FileOutputStream),而包裹节点流,将其作为参数而产生的新对象则属于包装流(如BufferedWriter),由于包装流中调用了参数中节点流的close方法,因此最终关闭流时,只需要让缓冲流调用close方法即同时关闭了节点流。

4.字符缓冲流特有的方法

1.BufferedReader:public String readLine(): 读一行文字。

如果要读文本全部内容,可以使用循环语句,终止条件为当readLine返回null时停止即可。

BufferedWriter:public void newLine(): 写一行行分隔符,由系统属性定义符号