详解Java的IO流Part4:Buffered缓冲流/高效流(字节缓冲流和字符缓冲流)

缓冲流是在基本的流对象基础之上创建而来的 相当于是对基本流对象的一种增强

缓冲流 也叫高效流 是对4个基本的File流的增强 所以也是4个流 将它们按照数据类型分类:
字节缓冲流: BufferedInputStreamBufferedOutputStream
字符缓冲流: BufferedReaderBufferedWriter

缓冲流的基本原理是在创建流对象时即创建一个内置的默认大小的缓冲区数组(缓冲区相当于一个数组)
通过缓冲区读写来减少系统输入输出次数 从而提高读写的效率
和File流传递char[1024]字节数组的原理类似

一、字节缓冲流

构造方法

public BufferedInputStream(InputStream in) :创建一个新的缓冲输入流
public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流
参数:InputStream字节输入流和OutputStream字节输出流
通过传递InputStream和OutputStream 缓冲流会使其增加一个缓冲区 提高写入/输出的效率

1、BufferedOutputStream字节缓冲输出流

java.io.BufferedOutputStream字节缓冲输出流继承自OutputStream

构造方法:

public BufferedOutputStream(OutputStream out) :创建一个新的缓冲输出流 使用默认缓冲区大小
public BufferedOutputStream(OutputStream out,int size) : 创建一个新的缓冲输出流 指定内部的缓冲区的大小

继承自父类的共性成员方法:

public abstract void write(int b) :将指定的字节写入此输出流

public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流

public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节 从偏移量 off开始输出到此输出流

public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出

public void close() :关闭此输出流并释放与此流相关联的任何系统资源

使用步骤:

1、创建FileOutputStream对象 构造方法中绑定要输出的目的地
2、创建BufferedOutputStream对象 构造方法中传递FileOutputStream对象 提高FIleOutputStream对象的效率
3、使用BufferedOutputStream对象中的write()方法 将数据写入到内部缓冲区中
4、使用BufferedOutputStream对象中的flush()方法 将内部缓冲区中的数据刷新到文件中
5、释放资源(第四步可省略 因为close()方法也会调用flush()方法)
注:释放资源的时候只需关闭缓冲流即可 在关闭缓冲流的时候会自动关闭基本流

public static void main(String[] args) throws IOException {
    // 创建FileOutputStream对象 构造方法中绑定要输出的目的地
    FileOutputStream fos=new FileOutputStream("F:\\IdeaProjects\\filetest\\a.txt");
    // 创建BufferedOutputStream对象 构造方法中传递FileOutputStream对象 提高FIleOutputStream对象的效率
    BufferedOutputStream bos=new BufferedOutputStream(fos);
    // 将数据写入到内部缓冲区中
    bos.write("我是帅哥".getBytes());
    // 释放资源
    bos.close();
}

2、BufferedInputStream字节缓冲输入流

java.io.BufferedInputStream字节缓冲输入流继承自InputStream

构造方法:

public BufferedInputStream(OutputStream out) :创建一个新的缓冲输入流 使用默认缓冲区大小
public BufferedInputStream(OutputStream out,int size) : 创建一个新的缓冲输入流 指定内部的缓冲区的大小

继承自父类的共性成员方法:

int read() 从输入流中读取数据的下一个字节

int read(byte[] b) 从输入流中读取一定数量的字节 并将其存储在缓冲区数组b中

void close() 关闭此输入流并释放与该流关联的所有系统资源

使用步骤:

1、创建FileInputStream对象 构造方法中绑定要读取的数据源
2、创建BuffedInputStream对象 构造方法中传递FileInputStream对象 提高读取效率
3、使用BuffedInputStream对象中的read()方法 读取文件
4、释放资源
注:释放资源的时候只需关闭缓冲流即可 在关闭缓冲流的时候会自动关闭基本流

public static void main(String[] args) throws IOException {
    // 创建FileInputStream对象 构造方法中绑定要读取的数据源
    FileInputStream fis=new FileInputStream("F:\\IdeaProjects\\filetest\\a.txt");
    // 创建BuffedInputStream对象 构造方法中传递FileInputStream对象 提高读取效率
    BufferedInputStream bis=new BufferedInputStream(fis);
    // 使用BuffedInputStream对象中的read()方法 读取文件
    int len=0; // 记录每次读取到的字节
    while ((len=bis.read())!=-1)
    {
        System.out.println(len);
    }
    // 释放资源
    bis.close();
}

还可以同时使用缓冲区数组 提高效率:

public static void main(String[] args) throws IOException {
    // 创建FileInputStream对象 构造方法中绑定要读取的数据源
    FileInputStream fis=new FileInputStream("F:\\IdeaProjects\\filetest\\a.txt");
    // 创建BuffedInputStream对象 构造方法中传递FileInputStream对象 提高读取效率
    BufferedInputStream bis=new BufferedInputStream(fis);
    // 使用BuffedInputStream对象中的read()方法 读取文件
    int len=0; // 记录每次读取到的字节
    byte[] bytes=new byte[1024];// 缓冲区数组 存储每次读取的数据
    while ((len=bis.read(bytes))!=-1)
    {
        System.out.println(new String(bytes,0,len));
    }
    // 释放资源
    bis.close();
}

二、字符缓冲流

构造方法

public BufferedReader(Reader in) :创建一个 新的缓冲输入流 使用默认缓冲区大小
public BufferedWriter(Writer out) : 创建一个新的缓冲输出流 指定内部的缓冲区的大小
参数:Reader字符输入流和Writer字符输出流
通过传递Reader和Writer 缓冲流会使其增加一个缓冲区 提高写入/输出的效率

1、BufferedWriter字符缓冲输出流

java.io.BufferedWriter字符缓冲输出流继承自Writer

构造方法:

BufferedWriter(Writer out):创建一个使用默认大小输出缓冲区的字符缓冲输出流
BufferedWriter(Writer out,int size):创建一个使用指定大小输出缓冲区的字符缓冲输出流

继承自父类的共性成员方法:

void write(int c) 写入单个字符

void write(char[] cbuf) 写入字符数组

abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分 off:数组的开始索引 len:写的字符个数

void write(String str) 写入字符串

void write(String str, int off, int len) 写入字符串的某一部分 off:字符串的开始索引 len:写的字符个数

void flush() 刷新该流的缓冲

void close() 关闭此流 但要先刷新它

特有的成员方法:

void newLine():写入一个行分隔符

可根据不同的操作系统获取不同的行分隔符
Windows:\r\n
Linux:/n
OS X:/r

使用步骤:

1创建字符缓冲输出流对象 构造方法中传递字符输出流
2、调用字符缓冲输出流中的write()方法 将数据写入到内存缓冲区中
3、调用字符缓冲输出流中的flush()方法 将内存缓冲区中的数据刷新到文件中
4释放资源

public static void main(String[] args) throws IOException {
    // 创建字符缓冲输出流对象 构造方法中传递字符输出流
    BufferedWriter bw=new BufferedWriter(new FileWriter("F:\\IdeaProjects\\filetest\\b.txt"));
    // 调用字符缓冲输出流中的write()方法 将数据写入到内存缓冲区中
    for (int i=0;i<5;i++)
    {
        bw.write("这是测试哦");
        bw.newLine();// 换行 写入一个行分隔符
    }
    // 将内存缓冲区中的数据刷新到文件中
    bw.flush();
    // 释放资源
    bw.close();
}

2、BufferedReader字符缓冲输入流

java.io.BufferedReader字符缓冲输入流继承自Reader

构造方法:

BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的字符缓冲输入流
BufferedReader(Reader in,int size):创建一个使用指定大小输入缓冲区的字符缓冲输入流

继承自父类的共性成员方法:

public int read() : 从输入流读取一个字符

public int read(char[] cbuf) : 从输入流中读取一些字符 并将它们存储到字符数组中

public void close() :关闭此流并释放与此流相关联的任何系统资源

特有的成员方法:

String readLine():读取一个文本行 直接读取一行
1、行的终止符号:换行(\n) 回车(\r) 或回车后跟着换行(\r\n)
2、返回值:包含该行内容的字符串 但不包含终止符
若已到达末尾 则返回null

public static void main(String[] args) throws IOException {
    // 创建字符缓冲输入流对象 构造方法中传递字符输入流
    BufferedReader br=new BufferedReader(new FileReader("F:\\IdeaProjects\\filetest\\b.txt"));
    // 使用字符缓冲输入流对象中的read()方法或readline()方法 读取文本
    // 当读取到null时 结束循环
    String line;
    while ((line=br.readLine())!=null)
    {
        System.out.println(line);
    }
    // 释放资源
    br.close();
}

你可能感兴趣的:(Java)