缓冲流分为字节缓冲流和字符缓冲流,缓冲流是在创建流对象的时候会先创建一个内置的默认大小的缓冲区数组,通过对缓冲区的读写来减少系统 IO 操作的次数,提高读写效率。
字节缓冲流有:BufferedInputStream、BufferedOutputStream,字符缓冲流:BufferedReader、BufferedWriter
BufferedInputStream 是字节缓冲输入流,常用的方法有:
方法名 | 描述 |
---|---|
public BufferedInputStream(InputStream in) | 构造方法,声明一个缓冲输入流 |
public synchronized int read() throws IOException | 将缓冲区里面的数据读取,如果读取到文件末尾,会返回 -1 ,否则返回读取内容的真正值 |
BufferedOutputStream 是字节缓冲输出流,常用的方法有
方法名 | 描述 |
---|---|
public BufferedOutputStream(OutputStream out) | 构造方法,声明一个缓冲输出流 |
public synchronized void write(int b) throws IOException | 将字节内容写入到缓冲区中 |
package com.haicoder.net.stream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class BufferedStreamTest {
public static void main(String[] args) throws Exception {
System.out.println("嗨客网(www.haicoder.net)");
//构造函数,创建输入流缓冲区和输出流缓冲区对象
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("/Users/haicoder/Documents/code/hai/filetest.txt"));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("/Users/haicoder/Documents/code/hai/filetestCopy.txt"));
int b;
while ((b = bufferedInputStream.read()) != -1) { //读取缓冲区里面的数据
bufferedOutputStream.write(b); //将数据写入缓冲区
}
bufferedInputStream.close();
bufferedOutputStream.close(); //不关闭,缓冲区里面的数据不会写入到文件里面
}
}
运行结果如下:
我们将 filetest.txt 文件内容拷贝到 filetestCopy.txt 文件里面,用到了字节缓冲流。
BufferedReader 是字符缓冲输入流,常用方法有
方法名 | 描述 |
---|---|
public BufferedReader(Reader in) | 构造方法,创建一个新的缓冲输入流 |
public String readLine() throws IOException | 读取文件里面的一行内容 |
BufferedWriter 是字符缓冲输出流,常用方法有
方法名 | 描述 |
---|---|
public BufferedWriter(Writer out) | 构造方法,创建一个新的缓冲输出流 |
public void newLine() throws IOException | 写一行行分隔符,由系统属性定义符号 |
package com.haicoder.net.stream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class BufferReaderWriterTest {
public static void main(String[] args) throws Exception {
System.out.println("嗨客网(www.haicoder.net)");
System.out.println("read 开始");
// 创建流对象
BufferedReader br = new BufferedReader(new FileReader("/Users/haicoder/Documents/code/hai/filetest.txt"));
// 定义字符串,保存读取的一行文字
String line = null;
// 循环读取,读取到最后返回null
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
System.out.println("read 结束");
System.out.println("write 开始");
// 创建流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("/Users/haicoder/Documents/code/hai/filetest.txt"));
// 写出数据
bw.write("嗨客网");
// 写出换行
bw.newLine();
bw.write("愿你前程似锦");
bw.newLine();
bw.write("办百年企业");
bw.newLine();
// 释放资源
bw.close(); //不关闭,缓冲区里面的数据不回写入到文件里面
System.out.println("write 结束");
}
}
运行结果如下
一开始文件里面的内容是 嗨客网(www.haicoder.net)
,通过字符缓冲流读取,并且打印了出来,然后通过字符缓冲流写入文件,将以前的内容覆盖,变成了我们想要的数据。
字节流和字符流都有对应的缓冲流,因为对文件的读取和写入都需要进行 IO 操作,在一定程度上会影响程序性能,增加机器压力,我们就有了缓冲的概念,它可以减少 IO 操作,我们可以通过对缓冲里面的数据进行操作,提升性能。
缓冲流我们知道,对流的操作,必须要执行 close 关闭操作,或者强制执行 flush。这样缓冲区里面的数据才会被写入到文件里面。