缓冲流
昨天学习了基本的一些六,作为IO流的入门,今天学习一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来,相当于是对基本流对象的一种增强。
概述
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。
缓冲流,也叫高效流,是对4个基本的FileXxx流的增强,所以也是4个流,按照数据类型分类:
字节缓冲流:BufferInputStream,BufferOutputStream
字符缓冲流:BufferReader,BufferWriter
(1)字节缓冲输出流BufferOutputStream
构造方法
构造方法摘要 | |
---|---|
BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。 | |
|
参数:OutputStream out 字节输出流,我们可以传递FileOutputStream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率。
int size:指定缓冲流内部缓冲区的大小,不指定就是默认大小
缓冲流使用步骤:
1.创建一个字节输出流对象FileOutputStream,构造方法绑定输出的目的地。
2.创建BufferedFileOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputStream对象写入效率。
3.使用BufferedFileOutputStream对象中的write方法,把数据写入到内部缓冲区中。
4.使用BufferedFileOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中。
5.释放资源(close方法本身就是先刷新数据再关闭,故写5可不写4)。
// 1.创建一个字节输出流对象FileOutputStream,构造方法绑定输出的目的地。 FileOutputStream fos = new FileOutputStream("D:\\a\\d.txt"); // 2.创建BufferedFileOutputStream对象,构造方法中传递FileOutputStream对象 // 提高FileOutputStream对象效率。 BufferedOutputStream bos = new BufferedOutputStream(fos); bos.write("我把数据写入到内部缓冲区中".getBytes()); // 4.使用BufferedFileOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中。 bos.flush(); // 5.释放资源 bos.close();
(2)字节缓冲输入流BufferInputStream
构造方法
构造方法摘要 | |
---|---|
BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in ,以便将来使用。 | |
BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in ,以便将来使用。 |
参数:InputStream out 字节输出流,我们可以传递FileInputStream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream的读出效率。
int size:指定缓冲流内部缓冲区的大小,不指定就是默认大小
缓冲流使用步骤:
1.创建一个字节输出流对象FileInputStream,构造方法绑定要读取的数据源。
2.创建BufferedFileInputStream对象,构造方法中传递FileInputStream对象,提高FileInputStream对象读取效率。
3.使用BufferedFileInputStream对象中的read方法,读取文件。
4.释放资源。
// 1.创建一个字节输出流对象FileInputStream,构造方法绑定要读取的数据源。 FileInputStream fis = new FileInputStream("D:\\a\\d.txt"); // 2.创建BufferedFileInputStream对象,构造方法中传递FileInputStream对象 BufferedInputStream bis = new BufferedInputStream(fis); int len = 0; // 3.使用BufferedFileInputStream对象中的read方法,读取文件。 while((len = bis.read()) != -1){ System.out.println(len); } bis.close(); // 4.释放资源
(3)字符缓冲输出流BufferWriter
构造方法
构造方法摘要 | |
---|---|
BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。 | |
BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。 |
参数:Writer out 字符输出流,我们可以传递FileWriter,缓冲流会给FileWriter增加一个缓冲区,提高FileWriter的读出效率。
int size:指定缓冲流内部缓冲区的大小,不指定就是默认大小
特有方法:
使用步骤:
1.创建一个字节输出流对象FileWriter,构造方法绑定输出的目的地。
2.创建BufferedFileWriter对象,构造方法中传递FileWriter对象,提高FileWriter对象写入效率。
3.使用BufferedFileWriter对象中的write方法,把数据写入到内部缓冲区中。
4.使用BufferedFileWriter对象中的方法flush,把内部缓冲区中的数据,刷新到文件中。
5.释放资源(close方法本身就是先刷新数据再关闭,故写5可不写4)。
// 1.创建一个字节输出流对象FileWriter,构造方法绑定输出的目的地。 FileWriter fw = new FileWriter("D:\\a\\e.txt"); // 2.创建BufferedFileWriter对象,构造方法中传递FileWriter对象,提高FileWriter对象写入效率。 BufferedWriter bw = new BufferedWriter(fw); // 3.使用BufferedFileWriter对象中的write方法,把数据写入到内部缓冲区中。 for (int i = 0; i < 10; i++) { bw.write(i); bw.newLine(); // 换行符 } // 4.使用BufferedFileWriter对象中的方法flush,把内部缓冲区中的数据,刷新到文件中。 bw.flush(); // 5.释放资源 bw.close();
(4)字符缓冲输入流BufferReader
构造方法
构造方法摘要 | |
---|---|
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。 | |
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。 |
参数:Reader out 字节输出流,我们可以传递FileReader,缓冲流会给FileReader增加一个缓冲区,提高FileReader的读出效率。
int size:指定缓冲流内部缓冲区的大小,不指定就是默认大小
特有方法:
public String readLine():读一行文字。
行终止符:读到换行符时认尾某行终止。
返回值:包含改行内容的字符串,不包含任何行终止符,如果已到该流末尾,则返回null。
使用步骤:
1.创建一个字节输出流对象FileReader,构造方法绑定要读取的数据源。
2.创建BufferedReader对象,构造方法中传递FileReader对象,提高FileReader对象读取效率。
3.使用BufferedReader对象中的read/readLine方法,读取文件。
4.释放资源。
// 1.创建一个字节输出流对象FileReader,构造方法绑定要读取的数据源。 FileReader fr = new FileReader("D:\\a\\c.txt"); // 2.创建BufferedReader对象,构造方法中传递FileReader对象 BufferedReader br = new BufferedReader(fr); // 3.使用BufferedReader对象中的read/readLine方法,读取文件。 String str = " "; while((str = br.readLine()) == null){ System.out.println(str); } // 4.释放资源。 br.close();
题目练习:乱序文本排序
// 字符缓冲输入流,按行读取文件 BufferedReader br = new BufferedReader(new FileReader("D:\\a\\无序出师表.txt")); // HashMap存储键值对 HashMap<Integer,String> map = new HashMap<>(); // 按行读取,并分割 String line = " "; while((line = br.readLine()) != null){ // 按行读取 // 强转,注意转义符 map.put(Integer.valueOf(line.split("\\.")[0]),line.split("\\.")[1]); } BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\a\\有序出师表.txt")); // HashMap无序,以计算德hashcode来排序,此处刚好有序 Set<Integer> keySet = map.keySet(); for(int key : keySet){ // 拼接key和value写入到缓冲输出流 bw.write(key + "." + map.get(key)); bw.newLine(); // 换行 } // 释放资源 br.close(); bw.close();