java的IO流中可以通过自定义一个数组来存储数据,为什么还要使用缓存区呢?
2017-03-23 · 知道合伙人互联网行家
思路:BufferedInputStream类中read()方法的工作原理
1)先一个一个从字节流中读取字节,读取一定量(自定义)之后,存储在一个字节数组(缓冲区)(FileInputStream.read(byte[] b)),并获得存储数量(read方法的返回值)。
2)一个一个字节返回,返回一个,存储数量减1,然后指针往后移一位,准备取下一个。
3)如果存储数量为0 ,代表当前数组中所有数据已经全部取完,此时再来一次读取(read(byte[] b)),再获得此次存储数量。
4)如果存储数量(即read方法返回-1),代表读到文件末尾,返回-1。
因此,需要用到以下几个变量:
读取的字节数量,指向数组中准备取哪一个的指针,将要返回的字节变量。
BufferedReader br = new BufferedReader(new FileReader(new File("123.txt")));
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("456.txt")));
char[] ch = new char[1024];
int len;
while((len = br.read(ch)) != -1){
bw.write(ch,0,len);
}
题主的疑惑是在上面第1行和第3行中的代码里是吧?
问:为什么第1行代码的BufferedReader缓冲流中已经定义了一个大小为8192的char[]数组,而第3行代码中还要定义一个大小为1024大小的char[]数组作为缓冲区?
答:BufferedReader中8192大小的char[]数组和自定义的1024大小的char[]数组不是在同一个环节作用的。
举个生活中的例子说明:BufferedReader中8192大小的char[]数组相当于快递站,自定义的1024大小的char[]数组相当于快递小哥骑的三轮车。快递小哥每次取一个快递后并不是立即往快递站送,而是先放到三轮车中,等到三轮车装满了,再一次性往快递站送;等到快递小哥送了8次,把快递站也装满了,再一次性把快递站中的货物全部送走。不知上面的解释有没有说清楚。