FileReader,用于读取字符流。
查看API显示FileReader类的继承关系是:
java.io.FileReader
该类包含的构造方法有:
FileReader(File file)
在给定从中读取数据的File的情况下创建一个新的FileReader。
FileReader(FileDescriptor fd)
在给定从中读取数据的FileDescriptor的情况下创建一个新的FileReader。
FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新的FileReader。
在此我们使用FileReader类先初始化一个该类的对象:
FileReader fr = new FileReader(“demo.txt”);
此时,若在该程序路径下不存在demo.txt文件,则会抛出异常。
在对应路径下创建demo.txt文件,并输入ab两个字符。
调用FileReader类的read()方法读取文件中的字符内容:
FileReader fr = new FileReader(“demo.txt”); //初始化fr对象
int ch = fr.read(); //调用read()方法,读取字符
System.out.println(ch);
fr.close(); //读取完毕,关闭文件
执行程序,查看结果发现输出的结果为:97.
不难理解,97对应的ASCII即为a。所以此处输出97。
若定义 char ch = fr.read();则输出字符a。
观察发现,文档中有a,b两个字符,但是只读取出一个,这是因为无参的read()方法只能读取单个字符。
重新设计程序:
FileReader fr = new FileReader(“demo.txt”);
int ch 1= fr.read();
System.out.println(ch1);
int ch2 = fr.read();
System.out.println(ch2);
fr.close();
执行程序,输出结果:97 98。
即read()方法接着上次读取位置向后读取。
修改程序:
FileReader fr = new FileReader(“demo.txt”);
int ch 1= fr.read();
System.out.println(ch1);
int ch2 = fr.read();
System.out.println(ch2);
int ch3 = fr.read();
System.out.println(ch3);
fr.close();
结果为:97 98 -1。
很明显-1不是文档中存储的数据,但是为什么在读取文档时候可以读取到呢?
这是因为文档在硬盘上存储的时候系统给文档创建了一个文档起始标志和结束标志,当读取到文档结尾时返回-1,证明文档结束。
但是上边的方法读取字符显得比较奇怪,可以使用下边的方法直接读出文档中的字符:
int ch = 0;
while((ch = fr.read()) != -1) //判断,只要不是-1(结束标志),输出字符。
{
System.out.println(ch);
}
也可以使用带参的read(char[])方法读取文档中的字符:
将修改demo.txt内容,变成abcde,读取文档字符:
FileReader fr = new FileReader(“demo.txt”);
char[] buf = new char[5]; //定义一个长度5的字符数组
int num = fr.read(buf); //调用read(char[]),返回读取字符
System.out.println(num + “:” + new String(buf));
fr.close();
直接读取出5个字符,并打印在控制台。