一、FileReader
1、FileReader 类概述
java.io.FileReader 类是读取字符文件的子类。构造时使用系统默认的字符编码和默认字符缓冲区。
FileReader 是用来操作字符文件的输入流,可以从字符文件中进行读取。
Tips:
① 字符编码:字节与字符的对应规则,Windows 系统的中文编码默认是GBK编码表,或者为 UTF-8;
② 字符缓冲区:一个字节数组,用来临时存储字节数据;
2、FileReader 类结构及方法
3、构造方法
FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。
参数:读取文件的数据源。
String fileName:文件的路径
File file:文件对象
构造方法的作用:
① 创建一个 FileReader 对象
② 会把 FileReader 对象指向要读取的文件
字符输入流的使用步骤:
① 创建 FileReader 对象,构造方法中绑定要读取的数据源(选择IO流,创建IO对象)。
② 使用 FileReader 对象中的方法 read 读取文件(读/写操作)。
③ 释放资源(关闭IO流)。
二、常用方法
可以发现在 FileReader 中并为声明过多的方法,都是调用其父类中已经存在的方法。
int read()
读取单个字符。 作为整数读取的字符, 范围在 0 到 65535 之间 (0x00-0xffff)(2个字节的Unicode码) , 如果已到达流的末尾, 则返回 -1
int read(char[] cbuf)
将字符读入数组。 如果已到达流的末尾, 则返回 -1。 否则返回本次读取的字符数。
int read(char[] cbuf,int off,int len)
将字符读入数组的某一部分。 存到数组cbuf中, 从off处开始存储, 最多读len个字符。 如果已到达流的末尾, 则返回 -1。 否则返回本次读取的字符数。
public void close() throws IOException
关闭此输入流并释放与该流关联的所有系统资源。
三、案例
1、将工程下的hello.txt文件内容读入程序中,并输出到控制台
1 @Test
2 public void testFileReader() {
3 FileReader fileReader = null;
4 try {
5 //1. 实例化File类的对象,指明要操作的文件
6 File file = new File("hello.txt");
7
8 //2.提供具体的流
9 fileReader = new FileReader(file);
10
11 //3.数据的读入
12 //read():返回读入的一个字符。如果达到文件末尾,返回-1
13 //方式一:
14 /*
15 int data = fileReader.read();
16 while (data != -1) {
17 System.out.print((char)data);
18 data = fileReader.read();
19 }
20 */
21 //方式二:语法上针对于方式一的修改
22 int data;
23 while ((data = fileReader.read()) != -1) {
24 System.out.print((char)data);
25 }
26
27 } catch (IOException e) {
28 e.printStackTrace();
29 } finally {
30 //4.流的关闭操作
31 //方式一:
32 /*
33 try {
34 if (fileReader != null) {
35 fileReader.close();
36 }
37 } catch (IOException e) {
38 e.printStackTrace();
39 }
40 */
41 if (fileReader != null) {
42 try {
43 fileReader.close();
44 } catch (IOException e) {
45 e.printStackTrace();
46 }
47 }
48 }
49 }
read 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1 ,循环读取。
2、使用read的重载方法
代码实现:
1 //对read()操作升级:使用read的重载方法
2 @Test
3 public void testFileReader1() {
4 FileReader fileReader = null;
5 try {
6 //1. 实例化File类的对象,指明要操作的文件
7 File file = new File("hello.txt");
8
9 //2.FileReader流的实例化
10 fileReader = new FileReader(file);
11
12 //3.读入的操作
13 //read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
14 char[] cbuf = new char[5];
15 int len; //记录的是每次读取的有效字符个数
16 while((len = fileReader.read(cbuf)) != -1){
17 //方式一:
18 //错误的写法
19 /*
20 for(int i = 0;i < cbuf.length;i++){
21 System.out.print(cbuf[i]);
22 }
23 */
24 //正确的写法
25 /*
26 for (int i = 0; i < len; i++) {
27 System.out.print(cbuf[i]);
28 }
29 */
30
31 //方式二:
32 //错误的写法,对应着方式一的错误的写法
33 //String str = new String(cbuf);
34 //System.out.print(str);
35
36 //正确的写法
37 String str = new String(cbuf,0,len);
38 System.out.print(str);
39 }
40 } catch (IOException e) {
41 e.printStackTrace();
42 } finally {
43 //4.资源的关闭
44 try {
45 if (fileReader != null) {
46 fileReader.close();
47 }
48 } catch (IOException e) {
49 e.printStackTrace();
50 }
51
52 }
53 }
read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回 -1。
3、
四、读取文件注意点
1、异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理;
2、读入的文件一定要存在,否则就会报FileNotFoundException;
3、字符流操作字符,只能操作普通文本文件。 最常见的文本文件: .txt, .java, .c, .cpp 等语言的源代码。尤其注意.doc,excel,ppt这些不是文本文件。