FileReader中使用read(char [] cbuf)方法读取数据
read(char [] cbuf);
- 读取文件中的数据,以字符为单位,每次读取cbuf数组长度个数据到我们的cbuf数组中,如果最后一次文件中剩余的未读取的数据不足装满这个数组,这个时候就默认从第一个位置(也就是索引为0的位置)开始替换,而数组中后面的几个元素没有替换,还是倒数第二次读取的数据
- 返回每次读入cbuf数组中的字符的个数,如果达到文件末尾,返回-1;
- 这个方法中的形参cbuf的含义就是"charbuffer",就是字符缓冲的意思
- 因为我们使用read()方法一次读取一个字符的的话,我们要执行的循环次数太多了,所以我们就像可以使用一个缓冲区(其实就是一个char [] )先将一部分数据一次存储到这个缓冲区中,然后我们一次就可以使用这个缓冲区中的全部数据
eg:这里我们通过一个程序来理解read(char [] cbuf)方法的使用 ----这个例子中我们通过FileReader类来读取数据
package IO流.FileReader.读取数据;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class Demo2 {
//这里我们将异常抛出了,按理这个时候我们应该使用try -- catch --- finally,但是这个时候我们只是做一个测试,
//我们就使用throws + 异常类型将异常对象抛出了
public static void main(String[] args) throws IOException{
/*
File类的实例化
*/
File file = new File("hi.txt");
/*
FileReader流的实例化
*/
FileReader fileReader = new FileReader(file);
/*
创建缓冲数组
*/
char [] chars = new char[5];
/*
创建一个临时变量存储每一次read()方法的返回值,因为最后一次读取的长度不一定等于数组的长度,这个时候
我们就不可以遍历整个数组,这个时候我们只能遍历读取的元素个数个元素,而读取的元素个数又是read()方法的返回值
所以我们使用的循环判断条件不能是缓冲数组的长度,而是read()方法返回值长度
*/
int size= 0;
/*
读入的操作
返回每次读入的cbuf数组中的字符的个数,如果达到文件末尾则返回01
*/
//这里我们提供了两种遍历方式都可以使用
// while((size = fileReader.read(chars)) != -1){
// for (int i = 0; i < size; i++) {
// System.out.println(chars[i]);
// }
// }
while((size = fileReader.read(chars)) != -1){
String str = new String(chars,0,size);
System.out.print(str);
}
/*
关闭流 --- 释放资源
*/
fileReader.close();
}
}
- 注意: 这个时候我们只是为了做一个测试,所以这里我们使用throws + 异常类型将异常对象直接抛出了,这个方式是错误的,这个时候我们应该是使用try ---- catch ---- finally的方式来处理异常,将我们的关闭流的操作放到finally代码块中
- 这个时候要注意,很可能我们还没有创建流对象就出现异常了,这个时候如果执行finally中的关闭流的操作就会出现一个空指针异常,所以这个时候我们最好进行一个if判断,如果流对象不为空再执行关闭流的操作