在(2)中我们讲了文件操作的基本的四个流,这篇文章中我们来了解下文件操作的几个增强流。
- 为什么要使用增强流
前面的几个基本的流,虽然可以读一定数组长度的文件,但是在日常中,我们一般都是一行一行的读写,而且每一行数据的多少也不一定能保证都一样,所以这个时候再使用这几个基本的流已经不能再满足我们的需求了,于是就产生了增强流这个东西。 - 了解增强流的基本概念
增强流是基本流的子类,在他们的基础上增加了部分功能,比如多了常用的readLine() ,用来读取一行的内容,我们再看一下两者构造方法的区别
BufferedReader(Reader in) //创建使用默认大小的输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz) //创建使用指定大小的输入缓冲区的缓冲字符输入流。
FileReader(File file) //在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(FileDescriptor fd)// 在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
FileReader(String fileName) // 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
FileReader构造方法中的参数是文件,意味着FileReader和最终的数据源相关联,这样的流成为底层流
BufferedReader的构造方法中的参数是一个流(BufferedReader比FileReader多出了一个readLine方法),意味着BufferedReader增强了FileReader的功能,这样的流称为增强流(或装饰流、包装流、高级流),增强流和底层流相关联。
BufferedReader和BufferedWriter内部自带了缓冲区(字符数组),默认大小是8k,即8192。
- 增强流的使用
BufferedReaderpublic class TestBufferedReader { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new FileReader(new File("D:\\a.txt"))); char[] buff = new char[10]; int length = br.read(buff); while(length != -1) { System.out.println(new String(buff,0,length)); length = br.read(buff); } br.close(); } }
对比以前的FileRead
public class TestReadeer {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("D:\\a.txt");
char[] buff = new char[10];
int length = reader.read(buff);
while(length != -1) {
System.out.print(new String(buff,0,length));
length = reader.read(buff);
}
reader.close();
}
}
一眼看上去两者在代码层次上都查不多,但是在运行是所进行的操作可大不相同,假设一个文件大小问N,如果没有使用BufferedReader,那么每次读取10个字符,至少和磁盘上的文件交互N/10次,当使用了BufferedReader时,每次先读8K的字符到缓冲数组中,先保存起来,和文件交互N/8192次。br.read(buff)实际上不在与文件打交道,而是读缓冲数组(内存)中的数据,读内存的速度很快。
结论
以后读取字符文件时都尽量使用BufferedReader
以后读取字节文件时都尽量使用BufferedInputStream
以后写字符文件时都尽量使用 BufferedWriter
以后写字节文件时都尽量使用 BufferedOutputStream