使用FileReader类的read(char [] chars)方法的注意点:
使用read(char [] chars)方法的时候注意点:
使用read(char [] chars)方法读取文件中的时候 — 如果这个时候我们的文件中有2从a - m一共十三个个英文字母,然后我们创建的缓冲数组chars的长度为5 ---- 这个时候我们每次就会读取五个英文字母并且将读取的五个英文字母装入到我们的缓冲数组中
第一次的时候我们的缓冲数组中的数据为:
|a,b,c,d,e|
第二次的时候我们的缓冲数组中的数据为:
|f,g,h,i,j|
第三次的时候我们的文件中的剩余为读取的元素剩余了3个,这个时候就会使用这三个元素替换缓冲数组中的前三个位置,这个时候缓冲数组中的后两个位置的元素还是 i 和 j
所以第三次的时候我们的缓冲数组中的数据为:
|k,l,m,i,j|
所以这个时候如果我们要输出我们的文件中的数据,这个时候我们就要输出数组中前三个元素----也就是输出我们每次读入到数组中的元素个数个
- 如果这个时候输出的循环控制条件是数组长度的话,这个时候输出结果中的第三次输出就多了一个i 和 j
例题: 相对于本项目之下有一个文件hi.txt,这个文件中的内容为: abcdefghjklm ,一共是十三个元素
这里我们先举一个错误例子 — 使用数组长度作为循环控制条件(这个时候输出为: a b c d e f g h i j k l m i j ),这个时候我们可以发现末尾多了一个i 和 j
package IO流.FileReader.读取数据;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class Demo3 {
public static void main(String[] args) throws IOException{
File file = new File("hi.txt");
FileReader fileReader = new FileReader(file);
char [] chars = new char[5];
while(fileReader.read(chars)!=-1){
/*
这个时候使用的是chars.length作为循环控制条件,这个时候第三次我们读取到数组的时候读取的是[K,l,m]
但是这个时候我们输出的时候却输出了五个元素,这个时候后两个元素就是上一次放进数组中的最后两个元素i和j
所以: 这个时候我们应该是使用每一次的read(chars)方法的返回值作为循环控条件
如果使用read(chars)方法返回值作为循环控制条件,这个时候第三次的时候我们读取了三个数据,输出的也就是三次
也就是三个数据
*/
for(int i = 0; i< chars.length ; i++){
System.out.println(chars[i]);
}
}
fileReader.close();
}
}
这个时候我们再使用每次读取的实际元素个数作为循环控制条件,也就是使用read(char [] chars)方法的返回值作为循环控制条件----这个时候输出就是正确的
package IO流.FileReader.读取数据;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class Demo4 {
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()方法的返回值
int size = 0;
while ((size = fileReader.read(chars)) != -1){
for(int i = 0 ; i< size ; i++){
System.out.println(chars[i]);
}
}
fileReader.close();
}
}
- 这个时候我们还是没有使用try ---- catch ---- finally来解决异常,这个时候我们主要是为了测试read(char[] cbuf)方法