【IO流系列】FileReader 字符输入流

字符流=字节流+字符集

1. 概述

FileReader 是 Java 中的字符输入流,用于从文件中读取字符数据。它继承自 InputStreamReader 类,实现了 Closeable 接口。

FileReader 主要用于读取文本文件的内容,一次读取一个字符或者一个字符数组。

特点:一次读取一个字节,遇到中文时,一次读取多个字节。

2. 作用

  1. 读取文本文件FileReader 主要用于读取文本文件的字符数据,可以逐字符地读取文件内容,也可以按行读取文件内容。通过 FileReader,可以将文件中的字符数据读取到程序中进行处理。

  2. 文本文件处理FileReader 可以用于对文本文件进行处理,例如读取配置文件、读取日志文件、读取数据文件等。通过逐字符或按行读取文件内容,程序可以对文件中的数据进行解析、分析或其他操作。

  3. 数据输入FileReader 可以作为数据源,将文件中的字符数据以流的方式输入到程序中,供其他处理逻辑使用。程序可以根据需要从文件中读取数据,并对数据进行相应的处理和操作。

  4. 简单文件读取:对于小型文件或者简单的文件读取需求,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. 注意事项

  1. 字符编码问题FileReader 使用平台默认的字符编码,可能会导致在不同环境下出现乱码或无法正确读取文件内容的情况。建议在创建 FileReader 对象时指定字符编码,以确保正确读取文件内容。

  2. 文件不存在异常:当指定的文件不存在时,FileReader 会抛出 FileNotFoundException 异常。在使用 FileReader 时应该捕获并处理这种异常情况,避免程序出现意外中断。

  3. 资源释放:使用完 FileReader 后应该及时关闭流资源,可以通过调用 close() 方法来释放相关的资源。确保及时释放资源可以避免内存泄漏和文件锁定等问题。

  4. 性能考虑FileReader 是按字符逐个读取文件内容的,对于大文件或大量数据的读取可能会影响性能。在处理大数据量时,考虑使用缓冲流来提高读取效率。

  5. 异常处理:在读取文件过程中可能会出现各种异常情况,例如 IO 异常、字符编码异常等,应该加入适当的异常处理机制来捕获和处理这些异常,保证程序的稳定性。

6. FileReader字符输入流原理解析

注意:只有字符流才有缓冲区,字节流没有缓冲区

字符流原理解析

  1. 创建字符输入流对象

    底层:关联文件,并创建缓冲区(长度为8192的字节数组)

  2. 读取数据
    • 底层:
      • 1.判断缓冲区中是否有数据可以读取

      • 2.缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区如果文件中也没有数据了,返回-1

      • 3.缓冲区有数据:就从缓冲区中读取。

        • 空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制

        • 返回有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷小洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值