概述

缓冲流,也叫高效流,是对4个基本的Flexxx流的增强,所以也是4个流,按照数据类型分类:
·字节缓冲流: BufferedInputstream , Bufferedoutputstream
·字符缓冲流: BufferedReader , Buffereduriter
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统10次数,从而提高读写的效率。

字节缓冲流

java. io. BufferedoutputStream extends OutputStream

BufferedoutputStream:字节缓冲输出流

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

public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b):将b. length字节从指定的字节数组写入此输出流。
public void write(bytel] b, int off, int Len) :从指定的字节数组写入Len字节,从偏移量of开始输出到此输出流。
public abstract void write(int b) :将指定的字节输出流。

构造方法:

Bufferedoutputstream(Outputstream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
Bufferedoutputstream(Outputstream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出参数:

OutputStream out:字节输出流

我们可以传递Fileoutputstream,缓冲流会给Fileoutputstream增加一个缓冲区,提高Fileoutputstream的与入效率
int size:指定缓冲流内部缓冲区的大小,不指定默认

使用步骤(重点)

1,创建Fileoutputstream对象,构造方法中绑定要输出的目的地
2·创建Bufferedoutputstream对象,构造方法中传递Fileoutputstream对象对象,提高Fileoutputstream对象效率3,使用BufferedoutputStream对象中的方法write,把数据写入到内部缓冲区中
4,使用Bufferedoutputstream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
5,释放资源(会先调用flush方法刷新数据,第4部可以省略)

  1. public static void main(String[] args) throws IOException {
  2. //1.创建FiLeoutputStream对象,构造方法中绑定要输出的目的地
  3. FileoutputStream fos - new Fileoutputstream( name: "10 1o\a.txt");
  4. //2.创建Bufferedoutputstream对象,构造方法中传递Fileoutputstream对象对象,提高FileoutputStream对象效率
  5. BufferedoutputStream bos - new BufferedoutputStream(fos);
  6. //3.使用BufferedoutputStream对象中的方法write,把数据写入到内部缓冲区中
  7. bos.write("我把数据写入到内部缓冲区中".getBytes());
  8. //4,使用Bufferedoutputstream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
  9. bos.flush(;
  10. //5.释放资源(会先调用flush方法刷新数据,第4部可以省略)
  11. bos.close();
  12. }

java. io.BufferedInputstream extends InputStream

BufferedInputstream:字节缓冲输入流

继承自父类的成员方法:

int read()从输入流中读取数据的下一个字节。
int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
void close()关闭此输入流并释放与该流关联的所有系统资源。

构造方法:

Bufferedinputstream( Inputstream in)创建一个BufferedInputstream并保存其参数,即输入流in,以便将来使用。
Bufferedinputstream( InputStream in, int size)创建具有指定缓冲区大小的BufferedInputstream并保存其参数,即输入流参数:

Inputstream in:字节输入流

我们可以传递FileInputstream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputstream的读取效率
int size:指定缓冲流内部暖冲区的大小,不指定默认

使用步骤(重点):

1·创建FileInputstream对象,构造方法中绑定要读取的数据源
2·创建BufferedInputstream对象,构造方法中传递FileInputstream对象,提高FileInputstream对象的读取效率3,使用BufferedInputstream对象中的方法read,读取文件
4.释放资源

  1. public static void main(string[] args) throws IOException {
  2. //1.创建FileInputstream对象,构造方法中绑定要读取的数据源
  3. FileInputStream fis - new FileInputstream( name: "10_1o\la.txt");
  4. //2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FiLeInputStream对象的读取效率
  5. BufferedInputStream bis - new BufferedInputstream(fis);
  6. //3,使用BufferedInputStream对象中的方法read,读取文件//int read()从输入流中读取数据的下一个字节。
  7. /*int Len=0://记录每次读取到的字节
  8. while((Len =bis. read())!--1){System. out.printLn(Len);*/
  9. //int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
  10. byte[] bytes -new byte{1024];//存储每次读取的数据int ien -e; //记录每次读取的有效字节个数
  11. while((len - bis.read(bytes))-1){
  12. System.out.println(new String(bytes, offset: e,len));
  13. }
  14. //4.释放资源
  15. bis.close();
  16. }

字符缓冲流

java. io. Bufferedwriter extends writer

Bufferedwriter:字符缓冲输出流

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

void write(int c)写入单个字符。
void write(char[] cbuf)写入字符数组。
abstract void write(chart].cbuf, int off, int Len)写入字符数组的某一部分,of数组的开始索引,Len写的字符个数。
void write(String str)写入字符串。
void write(string str, int off, int Len)写入字符串的某一部分,of字符串的开始索引, Len写的字符个数。
void flush()刷新该流的缓冲。
void close()关闭此流,但要先刷新它。

构造方法:

Bufferedwriter(writer out)创建一个使用默认大小输出缓冲区的缓冲字符输出流。
Bufferediriter(writer out, int sz)创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

参数:

writer out:字符输出流
我们可以传递Filewriter,缓冲流会给Filewriter增加一个缓冲区,提高Filewriter的写入效率int sz:指定缓冲区的大小,不写默认大小

特有的成员方法:

void newLine()写入一个行分隔符。会根据不同的操作系统,获取不同的行分隔符换行:换行符号
windows: Irin
Linux:/n
mac:/r

使用步骤:

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

public class Demoo3Bufferediriter
public static void main(string[] args) throws IOException {//System. out.printLn();
//1.创建字符缓冲输出流对象,构造方法中传递字符输出流
Bufferedwriter bw - new Bufferedwriter(new Filewriter( fileName: "10_1o\\c.txt"));
//2,调用字符缓冲输出流中的方法write,把数据写入到内存缓冲区中
for (intie; i <1<10; i++) {
bw.write( str: "传智播客"
//bw.write("irin");
bw.newline();
//3.调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中
bw.flush();
//4.释放资源
bw.close();
         }

java. io. BufferedReader extends Reader

BufferedReader字符缓冲输入流

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

int read()读取单个字符并返回
int read(char[] cbuf)一次读取多个字符,将字符读入数组。
void close()关闭该流并释放与之关联的所有资源。

构造方法:

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

参数:

Reader in:字符输入流
特有的成员方法:
我们可以传递FileReader,缓冲流会给FileReader增加一个缓冲区,提高FileReader的读取效率
String readuine()读取一个文本行。读取一行数据

返回值:

行的终止符号:通过下列字符之一即可认为某行已终止:换行(‘1n’)、回车(“1r)或回车后直接跟着换行(Irin)包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null

使用步骤:

1,创建字符缓冲输入流对象,构造方法中传递字符输入流
2,使用字符缓冲输入流对象中的方法read/readl ine读取文本
3.释放资源

public static void main(String[] args) throws IOException {
//1.创建字符缓冲输入流对象,构造方法中传递字符输入流
BufferedReader br - new BufferedReader(new FileReader( fileName: "10_1o\\c.txt"));
//2.使用字符缓冲输入流对象中的方法read/readLine读取文本
/*string line -br.readLine();
System. out.printLn(Line);
Line - br.readLine();
System. out.printLn(Line);
line - br.readLine();
System. out.printLn(Line);
Line - br.readLine();
System. out.printLn(Line);*/

  /*
  以上读取是一个重复的过程,所以可以使用循环优化
  不知道文件中有多少行数据,所以使用while循环
  while的结束条件,读取到nulL结束
  */
string line;
while((line -br.readLine ())!null){
system.out.println(line);1 I
}
//3.释放资源
br.close();

例题

042缓冲流 - 图1

对文本的内容进行排序

分析:

按照(1,2, 3. ..)顺序排序
1,创建一个HashNap集合对象,可以:存储每行文本的序号(1,2,3, ..); value:存储每行的文本2,创建字符缓冲输入流对象,构造方法中绑定字符输入流
3.创建字符缓冲输出流对象,构造方法中绑定字符输出流
4,使用字符缓冲输入流中的方法readline,逐行读取文本
5,对读取到的文本进行切割,获取行中的序号和文本内容
6,把切害蚊子的序号和文本的内容存储到HashMap集合中(key序号是有序的,会自动排序1,2, 3,4..)7,遍历HashMap集合,获取每一个键值对
8.把每一个键值对,拼接为一个文本行
9,把拼接好的文本,使用字符缓冲输出流中的方法write,写入到文件中
10.释放资源

代码

public static void main(string[] args) {
//1,创建一个HakhNap集合对象,可以:存储每行文本的序号(1,2, 3, ..); value:存储每行的文本
HashMap<String, string> map - new HashMap>();
//2.创建字符缓冲输入流对象,构造方法中绑定字符输入流
BufferedReader br - new BufferedReader(new FileReader( fileName: "10 1ol\in.txt"));
//3.创建字符缓冲输出流对象,构造方法中绑定字符输出流
Bufferediriter bw - new Bufferedriter(new Filewriter( fileName: "10 1olyout.txt"));
//4,使用字符缓冲输入流中的方法readline,逐行读取文本
String line;
while((line -br.readLine())!-null){
//5,对读取到的文本进行切割,获取行中的序号和文本内容
String[] arr -line.split( regex: "\1.");
//6,把切割蚊子的序号和文本的内容存储到HashMap集合中(key序号是有序的,会自动排序1,2, 3,4..)
map.put(arr[],arr[1]);
}
//7,遍历HashMap集合,获取每一个键值对
for(String key: map.keySet()){
  String value -map.get(key);
//18,把每一个键值对,拼接为一个文本行
line =key+ value;
//9,把拼接好的文本,使用字符缓冲输出流中的方法write,写入到文件中
bw.write(1ine);
bw.newline();//写换行
}
//10,释放资源bw.close();
br.close();
}