在字符流通常都使用read方法读入数据,而read方法一般都两种调用方式。
首先先创建一个文件,如Hello.txt,里面输入HelloWorld!
第一种是使用read的空参调用:read()
read()从输入流中读入一个字符,若当前位置无数据则返回-1
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class textFileReader1 {
public static void main(String[] args) throws IOException {
//1.File类的实例化
//在main中要用绝对路径
File file = new File("D:\\Hello.txt");
//2.FileReader流的实例化
FileReader fr = new FileReader(file);
//3.数据读入
int data1 = fr.read(); //从输入流中读入一个字符,若当前位置无数据则返回-1
System.out.println("用read()输出: ");
while(data1 != -1){
System.out.print((char) data1);
data1 = fr.read();
}
//4.流的关闭
fr.close();
}
}
输出结果:
第二种是使用read的有参调用:read(char[] cbuf)
read(char[] cbuf)是最多读入cbuf.length个字符,若当前位置无数据则返回-1
//这是伪代码,框架和read()一致
//3.数据读入
System.out.println("用read(char[] cbuf)输出: ");
char[] cbuf = new char[5] ;
int data2;
while((data2 = fr.read(cbuf)) != -1){
// 第一种输出
/* String str = new String(cbuf,0,data2);
System.out.print(str);*/
//第二种输出
for (int i = 0; i < data2; i++) {
System.out.print(cbuf[i]);
}
}
输出结果:
在学习read(char[] cbuf)方法的过程中发现了一点问题:
1.如果将i的截止条件换成cbuf.length,则输出结果就不能达到预期效果
char[] cbuf = new char[5] ;
int data2;
while((data2 = fr.read(cbuf)) != -1){
for (int i = 0; i < cbuf.length; i++) {
System.out.print(cbuf[i]);
}
}
输出结果:
这是因为首先第一次读入Hello这5个字符然后输出(如下图),第二次读入World输出,第三次则是第二次读入的数据的第一个位置替换成!,也就是将!读入到cbuf[0]的位置,剩下数据则是orld(如图)。而如果i截止到cbuf.length则是将整个读入的数据输出也就是输出HelloWorld!orld。
2.如果我们以下这样实现方法,则会出现一直循环Hello
char[] cbuf = new char[5];
int data2 = fr.read(cbuf);
while(data2 != -1){
for (int i = 0; i < data2; i++) {
System.out.print(cbuf[i]);
}
}
输出结果:
这是因为data2读入的只是Hello,然后进入到for循环,输出Hello,而data2一直不等于-1就陷入了死循环,则一直输出Hello。