Java文件IO核心知识点总结

一、IO 流核心分类

Java IO 流按照数据传输单位分为两类,所有文件操作流均继承自以下四大抽象父类,也是 IO 体系的顶层核心:

  • 字节流 :处理一切文件(文本、图片、视频、音频等),通用型流,核心父类:InputStream(输入字节流)、OutputStream(输出字节流)

  • 字符流 :仅处理纯文本文件(.txt、.java、.md 等),基于编码转换,核心父类:Reader(输入字符流)、Writer(输出字符流)

核心区别:字节流读写字节 (0-255 原始数据),无编码问题;字符流读写字符,自动适配编码,解决中文乱码问题。

二、四大流八大核心方法(必考重点)

四大抽象父类定义了 IO 流的核心通用方法,共 8 个高频方法,是所有文件读写操作的基础,子类(FileInputStream、FileReader 等)均重写这些方法。

1. 字节流 4 大核心方法

InputStream(字节输入流:读取文件数据)
  • int read() :无参读取,每次读取文件单个字节 ,返回读取的字节数值;读到文件末尾返回 -1。效率极低,不推荐用于大文件。

  • int read(byte\[\] b) :带字节数组参数,批量读取数据,将读取的字节存入数组,返回实际读取的字节个数;无数据返回 -1。是字节流最常用读取方式。

  • int read(byte\[\] b, int off, int len):精准读取,从数组下标 off 位置开始,最多读取 len 个字节,返回实际读取长度,灵活适配分段读取场景。

  • void close():关闭流资源,释放文件占用的系统资源,IO 操作必须执行关闭,否则会造成资源泄露。

OutputStream(字节输出流:写入文件数据)
  • void write(int b):写入单个字节,传入字节数值,向文件写入单个字节数据。

  • void write(byte\[\] b):批量写入,将整个字节数组的数据写入文件,高频常用方法。

  • void write(byte\[\] b, int off, int len):分段写入,从数组 off 下标开始,写入 len 长度的字节数据,适配局部数据写入。

  • void flush():刷新缓冲区(字节流缓冲区较小,效果不明显,缓冲字节流必备),强制将缓冲区数据写入文件,避免数据滞留丢失。

  • void close():关闭输出流,关闭前会自动执行 flush 刷新操作。

2. 字符流 4 大核心方法

Reader(字符输入流:读取文本文件)

方法逻辑与 InputStream 高度一致,仅数据单位从字节 变为字符,适配文本读取:

  • int read():读取单个字符,返回字符编码值,末尾返回 -1

  • int read(char\[\] cbuf):字符数组批量读取,返回实际读取字符数

  • int read(char\[\] cbuf, int off, int len):分段读取字符数据

  • void close():关闭字符输入流资源

Writer(字符输出流:写入文本文件)
  • void write(int c):写入单个字符

  • void write(char\[\] cbuf):批量写入字符数组

  • void write(char\[\] cbuf, int off, int len):分段写入字符数据

  • void flush():字符流缓冲区效果显著,必须手动刷新,否则数据会存在缓冲区,无法写入文件

  • void close():关闭流,自动刷新缓冲区

✅ 八大核心方法总结:3个read + 3个write + flush + close,覆盖所有基础文件读写场景。

三、高频知识点:引用类型作为输出型参数

1. 核心原理

IO 流中 read(byte[] b)read(char[] cbuf) 方法是输出型参数 的典型应用。Java 是值传递机制,基本数据类型无法带回方法内修改的数据,而**引用类型(数组、对象)**可以作为输出参数。

原理:方法参数传递的是数组的内存地址,方法内部对数组元素的修改,会直接影响原数组,无需返回值即可实现数据传出。

2. IO 场景实战解读

int read(byte[] b) 为例:

  • 传入的 byte 数组是容器,用于存储读取到的文件数据

  • 方法返回值仅用于告知读取成功的字节数量,真正的读取数据存在原数组中

  • 这是 IO 批量读写的核心原理,大幅提升读写效率(减少 IO 交互次数)

易错点:读取后不能直接使用数组全部数据,必须根据返回的有效长度截取数据,否则会读取到上次残留的旧数据。

四、重点优化:try-with-resources 自动资源关闭

1. 传统 IO 流的问题

传统 try-catch-finally 写法中,流关闭必须放在 finally 中,代码冗余、嵌套繁琐,且容易出现关闭失败、遗漏关闭的问题,导致文件资源泄露,占用系统文件句柄。

2. try-with-resources 作用与优势

JDK7 新增特性,自动实现资源关闭,无需手动写 close() 方法,核心作用:

  • 自动释放资源 :所有实现 AutoCloseableCloseable 接口的流对象(所有 IO 流),在 try 代码块执行完毕后,无论正常结束还是异常终止,都会自动调用 close() 关闭资源

  • 简化代码:去除冗余的 finally 关闭逻辑,代码简洁优雅

  • 避免资源泄露:彻底解决手动关闭遗漏、异常导致关闭失效的问题

3. 使用规范

将流对象的创建直接写在 try() 括号内 ,多个流用分号分隔,无需手动关闭。是目前 Java IO 开发的标准写法

五、核心总结与使用场景

  1. 流选择原则:所有文件通用选字节流;仅纯文本文件、需避免乱码选字符流

  2. 方法优先级:优先使用数组批量读写(read(数组)/write(数组)),禁止单字节循环读写,效率差距极大

  3. 输出参数核心:数组作为容器承载读写数据,返回值仅标识有效数据长度

  4. 资源关闭原则:统一使用 try-with-resources,摒弃手动 finally 关闭,杜绝资源泄露

  5. 字符流必刷缓冲:字符输出流若不使用自动关闭,必须手动 flush,否则数据丢失

相关推荐
EatFan2 小时前
从单体到模块化:我的 Spring Boot 项目为什么拆成 framework、module、server?
java·spring boot·后端
szarron2 小时前
HTOOL‑SA12 + HT06 近场探头组合实操|手持设备工位 EMI 预兼容排查完整流程
运维·服务器·开发语言·网络·射频工程·频谱仪
菜鸟~noob2332 小时前
【电子战】第07篇:多普勒测向【含matlab代码】
android·开发语言·matlab
Java内核笔记2 小时前
Spring Boot 4 可观测性源码剖析:OpenTelemetry 全链路打通日志、指标、追踪
java·后端
Wang's Blog2 小时前
Java框架快速入门: Spring Security+OAuth2之跨域处理
java·开发语言·spring
雪芽蓝域zzs2 小时前
第四十二节:全局字典封装(后端字典,下拉选择复用)
开发语言·前端·javascript
我是大猴子2 小时前
MyBatis‑Plus & MyBatis‑Flex 区别
java·服务器·数据库
老王爱玩车2 小时前
第2讲:C语言数据类型和变量
c语言·开发语言