源本科技 | 码上会

Java FileReader

2026/01/30
22
0

学习目标

  • 理解 FileReader 类的基本用途及其在字符流体系中的位置

  • 掌握 FileReader 的三种构造方法及其适用场景

  • 熟悉常用读取方法(如 read()ready()close() 等)的使用方式

  • 能够编写程序通过 FileReader 逐字符或批量读取文本文件内容

  • 区分字符流与字节流的使用场景,避免误用于二进制数据


什么是 FileReader

FileReader 是 Java 中用于以字符形式读取文件内容的类。它属于字符输入流,专门用于处理文本文件。由于其内部自动处理字符编码,因此非常适合读取 .txt.java.csv 等纯文本格式。

注意:若需读取图片、音频、视频等二进制数据,应使用 FileInputStream,而非 FileReader

核心特性

  • 基于 16 位 Unicode 字符:每次读取一个 char(即两个字节)

  • 自动处理字符编码:默认使用平台默认编码(如 UTF-8、GBK 等)

  • 跨平台兼容:在 Windows、Linux、macOS 上行为一致

  • 继承自 InputStreamReader:是 Reader 抽象类的具体实现之一


构造方法

FileReader 提供三种构造函数,适用于不同场景:

构造方法

说明

FileReader(String fileName)

通过文件路径字符串创建读取器

FileReader(File file)

通过 File 对象创建读取器

FileReader(FileDescriptor fdObj)

通过文件描述符创建(常用于底层 I/O 操作)

// 方式一:直接传入文件名
FileReader reader1 = new FileReader("data.txt");

// 方式二:先创建 File 对象
File file = new File("data.txt");
FileReader reader2 = new FileReader(file);

// 方式三:使用文件描述符(较少见)
FileDescriptor fd = FileDescriptor.in; // 标准输入
FileReader reader3 = new FileReader(fd);

常用方法

方法

功能说明

int read()

读取单个字符,返回其 int 值(0~65535),若到达文件末尾则返回 -1

int read(char[] cbuf, int off, int len)

将最多 len 个字符读入 cbuf 数组,从索引 off 开始存放,返回实际读取字符数

boolean ready()

判断流是否已准备好读取(缓冲区非空)

String getEncoding()

返回当前使用的字符编码名称(如 "UTF-8")

void close()

关闭流并释放系统资源(必须调用!


读取文本文件

以下程序演示了两种读取方式:逐字符读取和批量读取。

import java.io.*;

class FileReaderDemo {
    
    public static void main(String[] args) {
        try {
            // 创建 FileReader 实例
            FileReader fileReader = new FileReader("example.txt");

            System.out.println("逐字符读取:\n");
            int ch;
            while ((ch = fileReader.read()) != -1) {
                System.out.print((char) ch);
            }

            // 重置流指针(注意:FileReader 不支持 reset,此处需重新打开)
            fileReader = new FileReader("example.txt");

            System.out.println("\n\n使用字符数组批量读取:\n");
            char[] buffer = new char[10];
            int count;
            while ((count = fileReader.read(buffer)) != -1) {
                System.out.print(new String(buffer, 0, count));
            }

            // 关闭资源
            fileReader.close();
            System.out.println("\n\nFileReader 已关闭!");
        } catch (IOException e) {
            System.err.println("发生 I/O 错误: " + e.getMessage());
        }
    }
}

提示:由于 FileReader 内部没有缓冲机制,频繁调用 read() 效率较低。生产环境中建议配合 BufferedReader 使用以提升性能。


重点总结

  • FileReader字符输入流,仅适用于文本文件

  • 默认使用平台默认字符编码,如需指定编码(如 UTF-8),应使用 InputStreamReader 包装 FileInputStream

  • 必须显式调用 close() 以释放文件句柄,否则可能导致资源泄漏

  • 不支持 mark() / reset() 操作,不具备回退能力

  • 高频读取时建议使用 BufferedReader 包装 FileReader 以提高效率


思考题

  1. 为什么不能用 FileReader 读取一张 JPG 图片?如果强行读取会发生什么?

  2. FileReaderFileInputStream 在底层读取机制上有何本质区别?

  3. 如何修改上述示例,使其能够正确读取 UTF-8 编码的中文文本文件?