一、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这些不是文本文件。