字符流
=字节流
+字符集
1. 概述
FileReader
是 Java 中的字符输入流,用于从文件中读取字符数据。它继承自 InputStreamReader
类,实现了 Closeable
接口。
FileReader
主要用于读取文本文件的内容,一次读取一个字符或者一个字符数组。
特点:一次读取一个字节,遇到中文时,一次读取多个字节。
2. 作用
-
读取文本文件:
FileReader
主要用于读取文本文件的字符数据,可以逐字符地读取文件内容,也可以按行读取文件内容。通过FileReader
,可以将文件中的字符数据读取到程序中进行处理。 -
文本文件处理:
FileReader
可以用于对文本文件进行处理,例如读取配置文件、读取日志文件、读取数据文件等。通过逐字符或按行读取文件内容,程序可以对文件中的数据进行解析、分析或其他操作。 -
数据输入:
FileReader
可以作为数据源,将文件中的字符数据以流的方式输入到程序中,供其他处理逻辑使用。程序可以根据需要从文件中读取数据,并对数据进行相应的处理和操作。 -
简单文件读取:对于小型文件或者简单的文件读取需求,
FileReader
提供了一种便捷的方式来读取文件内容,不需要复杂的处理逻辑。通过FileReader
可以快速实现文件内容的读取操作。
3. 方法
① 创建字符输入流对象
构造方法 | 说明 |
---|---|
public FileReader(File file) | 创建字符输入流关联本地文件 |
public FileReader(String pathname) | 创建字符输入流关联本地文件 |
细节1: 如果文件不存在,就直接报错。
② 读取数据
成员方法 | 说明 |
---|---|
public int read() | 读取数据,读到末尾返回-1 |
public int read(char[] buffer) | 读取多个数据,读到末尾返回-1 |
细节1: 按字节进行读取遇到中文,一次读多个字节,读取后解码,返回一个整数
细节2: 读到文件末尾了,read
方法返回-1。
③ 释放资源
成员方法 | 说明 |
---|---|
public void close() | 释放资源/关闭流 |
4. 代码示例
4.1 空参reader方法
- 代码示例
package text.IOStream.FileReader.FileReader01; import java.io.FileReader; import java.io.IOException; /* FileReader 字符流=字节流+字符集 ① 创建字符输入流对象 | 构造方法 | 说明 | | ---------------------------------- | -------------------------- | | public FileReader(File file) | 创建字符输入流关联本地文件 | | public FileReader(string pathname) | 创建字符输入流关联本地文件 | 细节1:如果文件不存在,就直接报错。 ② 读取数据 | 成员方法 | 说明 | | ------------------------------ | ---------------------------- | | public int read() | 读取数据,读到末尾返回-1 | | public int read(char[] buffer) | 读取多个数据,读到末尾返回-1 | 细节1:按字节进行读取遇到中文,一次读多个字节,读取后解码,返回一个整数 细节2:读到文件末尾了,read方法返回-1。 ③ 释放资源 | 成员方法 | 说明 | | ---------------- | ------------- | | public int close | 释放资源/关流 | */ public class FileReader01 { public static void main(String[] args) throws IOException { //创建对象 FileReader fr = new FileReader("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileReader\\FileReader01\\a.txt"); //读取数据(空参读取reader()) //字符流的底层也是字节流,默认一个字节一个字节的读取 //如果遇到中文,则一次读取多个字节,GBK一次读取两个,UTF-8一次读取三个 //read()空参构造细节: //1.read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个 //2.在读取之后,方法的底层还会进行解码并转成十进制。最终把这个十进制作为返回值,这个十进制的数据也表示在字符集上的数字 // 英文:文件里面二进制数据假设为: 0110 8001 //read方法进行读取,解码并转成十进制97 // 中文:文件里面的二进制数据假设为: 11100110 10110001 10001001 //read方法进行读取,解码并转成十进制27721 int b; while ((b = fr.read()) != -1) { //System.out.print(b + " "); //70 105 108 101 82 101 97 100 101 114 13 10...... System.out.print((char) (b)); } //释放资源 fr.close(); } }
- 输出结果
-
a.txt
-
程序输出
-
4.2 带参reader方法
- 代码示例
package text.IOStream.FileReader.FileReader02; import java.io.FileReader; import java.io.IOException; /* FileReader 字符流=字节流+字符集 ① 创建字符输入流对象 | 构造方法 | 说明 | | ---------------------------------- | -------------------------- | | public FileReader(File file) | 创建字符输入流关联本地文件 | | public FileReader(string pathname) | 创建字符输入流关联本地文件 | 细节1:如果文件不存在,就直接报错。 ② 读取数据 | 成员方法 | 说明 | | ------------------------------ | ---------------------------- | | public int read() | 读取数据,读到末尾返回-1 | | public int read(char[] buffer) | 读取多个数据,读到末尾返回-1 | 细节1:按字节进行读取遇到中文,一次读多个字节,读取后解码,返回一个整数 细节2:读到文件末尾了,read方法返回-1。 ③ 释放资源 | 成员方法 | 说明 | | ---------------- | ------------- | | public int close | 释放资源/关流 | */ public class FileReader02 { public static void main(String[] args) throws IOException { //创建对象 FileReader fr = new FileReader("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileReader\\FileReader02\\a.txt"); //读取数据(reader(char[] buffer))带参构造的reader方法 //reader() 带参构造细节: //读取数据、解码、强转三步合并,把强转之后的字符放到数组中 //相当于空参的reader方法+强转类型转换 //创建数组,让其每次读取两个 char[] chars = new char[2]; int len;//定义变量记录读取的数据个数 while ((len = fr.read(chars)) != -1) { //fr.read(chars)返回值len表示一次读取了几个数据 System.out.print(new String(chars, 0, len));//len 每次读取的有效字节个数 } // 释放资源 fr.close(); } }
- 输出结果
-
a.txt
-
程序输出
-
5. 注意事项
-
字符编码问题:
FileReader
使用平台默认的字符编码,可能会导致在不同环境下出现乱码或无法正确读取文件内容的情况。建议在创建FileReader
对象时指定字符编码,以确保正确读取文件内容。 -
文件不存在异常:当指定的文件不存在时,
FileReader
会抛出FileNotFoundException
异常。在使用FileReader
时应该捕获并处理这种异常情况,避免程序出现意外中断。 -
资源释放:使用完
FileReader
后应该及时关闭流资源,可以通过调用close()
方法来释放相关的资源。确保及时释放资源可以避免内存泄漏和文件锁定等问题。 -
性能考虑:
FileReader
是按字符逐个读取文件内容的,对于大文件或大量数据的读取可能会影响性能。在处理大数据量时,考虑使用缓冲流来提高读取效率。 -
异常处理:在读取文件过程中可能会出现各种异常情况,例如 IO 异常、字符编码异常等,应该加入适当的异常处理机制来捕获和处理这些异常,保证程序的稳定性。
6. FileReader
字符输入流原理解析
注意:只有
字符流
才有缓冲区,字节流
没有缓冲区
字符流原理解析
- 创建字符输入流对象
底层:关联文件,并创建缓冲区(长度为8192的字节数组)
- 读取数据
- 底层:
-
1.判断缓冲区中是否有数据可以读取
-
2.
缓冲区没有数据
:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区如果文件中也没有数据了,返回-1 -
3.
缓冲区有数据
:就从缓冲区中读取。-
空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制
-
返回有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中
-
-
- 底层: