当前位置: 首页 > news >正文

FileReader 详细解析与记忆方法

FileReader 详细解析与记忆方法

一、FileReader 核心概念

FileReader 是 Java 中用于读取字符文件的类,继承自 InputStreamReader,属于字符流体系。

1. 核心特点

特性说明
继承关系Reader → InputStreamReader → FileReader
数据单位字符(16位 Unicode)
用途读取文本文件(自动处理默认编码)
是否缓冲默认无缓冲(需配合 BufferedReader 使用)
编码依赖使用系统默认编码(可能因环境不同导致乱码)

2. 构造方法

java

// 1. 通过文件路径创建
FileReader fr = new FileReader("text.txt");

// 2. 通过File对象创建
File file = new File("text.txt");
FileReader fr = new FileReader(file);

// 3. 通过文件描述符创建(较少用)
FileDescriptor fd = new FileDescriptor();
FileReader fr = new FileReader(fd);

3. 核心方法

方法作用
int read()读取单个字符(返回Unicode值,-1表示结束)
int read(char[] cbuf)读取字符到数组,返回实际读取的字符数
int read(char[] cbuf, int off, int len)从偏移量off开始读取len个字符到数组
void close()关闭流

二、使用示例

1. 基础读取文件

java

try (FileReader fr = new FileReader("text.txt")) {
    int charCode;
    while ((charCode = fr.read()) != -1) {
        System.out.print((char) charCode); // 转为字符输出
    }
}

2. 高效读取(缓冲区)

java

try (BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {
    String line;
    while ((line = br.readLine()) != null) { // 按行读取
        System.out.println(line);
    }
}

3. 读取到字符数组

java

char[] buffer = new char[1024];
try (FileReader fr = new FileReader("text.txt")) {
    int charsRead;
    while ((charsRead = fr.read(buffer)) != -1) {
        System.out.println(new String(buffer, 0, charsRead));
    }
}

三、记忆技巧

1. 名称解析法

"File + Reader"

  • File:操作文件

  • Reader:字符输入流

2. 对比记忆法

对比类数据单位编码处理典型用途
FileReader字符使用系统默认编码读取系统默认编码的文本
InputStreamReader字符可指定编码(如UTF-8)需要明确编码的文本读取
FileInputStream字节无编码处理二进制文件读取

3. 使用场景联想

  • 读配置文件FileReader + Properties.load()

  • 日志分析BufferedReader + FileReader 逐行处理

  • 文本处理:读取后按字符/行处理内容

4. 常见误区提醒

❌ 错误用法:用 FileReader 读取非默认编码文件(如UTF-8文件在GBK系统中)
✅ 解决方案:改用 InputStreamReader 并指定编码:

java

new InputStreamReader(new FileInputStream("text.txt"), "UTF-8");

四、面试高频问题

1. FileReader 和 FileInputStream 的区别?

  • FileReader:按字符读取(自动编码转换),适合文本

  • FileInputStream:按字节读取,适合二进制文件

2. 为什么读取中文有时会乱码?

  • 原因FileReader 使用系统默认编码(如GBK),与文件实际编码(如UTF-8)不匹配

  • 解决:改用 InputStreamReader 明确指定编码

3. 如何高效读取大文本文件?

java

// 方案1:缓冲流按行读取
try (BufferedReader br = new BufferedReader(new FileReader("large.txt"))) {
    br.lines().forEach(System.out::println);
}

// 方案2:NIO的Files工具类(Java 8+)
Files.lines(Paths.get("large.txt")).forEach(System.out::println);

4. FileReader 可以读取图片吗?

  • 不可以:图片是二进制文件,应用 FileInputStream

  • 后果:强行读取会导致数据损坏(字符流会尝试解码字节为字符)


五、总结图示

mermaid

flowchart TD
    A[FileReader] --> B[读取文本文件]
    A --> C[自动使用默认编码]
    A --> D[需配合缓冲流提升性能]
    B --> E[配置文件/日志等]
    D --> F[BufferedReader]

一句话总结
"FileReader读文本,默认编码要当心,缓冲读取更高效,二进制文件别用它"

掌握这些知识点后,文本文件读取将变得轻松高效! 🚀

相关文章:

  • DataEase同比环比
  • 微信小程序实战案例 - 餐馆点餐系统 阶段 2 – 购物车
  • 嵌入式常见概念的介绍
  • C++ 重构muduo网络库
  • FPGA 37 ,FPGA千兆以太网设计实战:RGMII接口时序实现全解析( RGMII接口时序设计,RGMII~GMII,GMII~RGMII 接口转换 )
  • 微信小程序跳4
  • RT-2论文深度解读:视觉-语言-动作统一模型的机器人泛化革命
  • AI NAS:当网络存储与人工智能深度融合的技术路径与未来展望
  • nvm使用手册
  • java零基础教学笔记
  • 02核心-EffectSpec,EffectContext
  • RV1106 OCR 识别算法
  • 代码随想录算法训练营day3(链表)
  • 流与分组的共生关系
  • vue + uniapp 实现仿百度地图/高德地图/美团/支付宝 滑动面板 纯css 实现
  • Matlab个性化绘图第10期—滑珠进度柱状图
  • 富文本编辑器的内容导出html,并保留图片
  • 【第41节】windows的中断与异常及异常处理方式
  • 【第四十周】文献阅读:用于检索-增强大语言模型的查询与重写
  • 精品整理 | 云安全知识证书 (CCSK) v5 备考学习资源汇总
  • 美国务卿会见叙利亚外长,沙特等国表示将支持叙利亚重建
  • 泉州围头湾一港区项目炸礁被指影响中华白海豚,官方:已叫停重新评估
  • 把中国声音带向世界,DG和Blue Note落户中国
  • 透视社会组织创新实践中的花开岭现象:与乡村发展的融合共进
  • 因存在安全隐患,福特公司召回约27.4万辆SUV
  • 当代科技拟召开债券持有人会议 ,对“H20科技2”进行四展