天天看点

java文件操作中的几个流的关系(3)

在(2)中我们讲了文件操作的基本的四个流,这篇文章中我们来了解下文件操作的几个增强流。

  1. 为什么要使用增强流

    前面的几个基本的流,虽然可以读一定数组长度的文件,但是在日常中,我们一般都是一行一行的读写,而且每一行数据的多少也不一定能保证都一样,所以这个时候再使用这几个基本的流已经不能再满足我们的需求了,于是就产生了增强流这个东西。

  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。

  1. 增强流的使用

    BufferedReader

    public 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

继续阅读