Java IO(Input/Output)流是 Java 语言中实现数据输入与输出的核心 API 体系,基于 ** 流(Stream)** 抽象模型,屏蔽底层硬件差异,为程序与外部设备(文件、网络、内存、管道等)之间的数据传输提供统一、标准的操作接口,是文件操作、网络通信、数据序列化、日志处理等场景的基础技术支撑。
一、核心设计思想
- 流抽象 将数据传输抽象为数据流,数据以连续字节 / 字符序列形式顺序传输。
- 单向传输流分为输入流与输出流,方向固定,不可反向操作。
- 装饰器模式通过包装流对基础节点流进行功能增强,实现灵活组合与扩展。
- 平台无关统一接口封装操作系统差异,一次编写多平台运行。
二、IO 流体系分类
1. 按数据传输方向划分
- 输入流(Input):从外部设备读取数据到程序内存
- 输出流(Output):将程序内存数据写入外部设备
2. 按数据处理单位划分
-
字节流(Byte Stream)
- 以 byte(8 位) 为基本处理单位
- 顶层父类:
InputStream、OutputStream - 适用:图片、音频、视频、压缩包、二进制文件等所有类型数据
-
字符流(Character Stream)
- 以 char(16 位) 为基本处理单位
- 顶层父类:
Reader、Writer - 内置编码转换,专为文本文件设计
3. 按功能与角色划分
-
节点流(低级流) 直接与数据源 / 目的地连接,如
FileInputStream、FileReader。 -
处理流(高级流 / 包装流) 对节点流进行包装,增强功能:缓冲、序列化、对象读写、格式化等。典型:
BufferedInputStream、ObjectOutputStream、PrintWriter。
三、核心基类与常用实现
字节流体系
-
InputStream(抽象父类)
FileInputStream:文件字节输入ByteArrayInputStream:内存字节数组输入BufferedInputStream:缓冲字节输入ObjectInputStream:对象反序列化
-
OutputStream(抽象父类)
FileOutputStream:文件字节输出ByteArrayOutputStream:内存字节数组输出BufferedOutputStream:缓冲字节输出ObjectOutputStream:对象序列化PrintStream:格式化打印输出(如System.out)
字符流体系
-
Reader(抽象父类)
FileReader:文件字符输入BufferedReader:缓冲字符输入(支持readLine())InputStreamReader:字节转字符(编码转换核心)
-
Writer(抽象父类)
FileWriter:文件字符输出BufferedWriter:缓冲字符输出OutputStreamWriter:字符转字节PrintWriter:格式化字符输出
四、关键特性与机制
-
顺序访问 数据只能从头至尾顺序读写,不支持随机定位(
RandomAccessFile除外)。 -
缓冲机制缓冲流减少频繁 IO 操作,显著提升读写效率,是高性能 IO 的标配。
-
编码支持 转换流
InputStreamReader/OutputStreamWriter可指定 UTF-8、GBK 等编码,解决中文乱码问题。 -
资源关闭 流属于操作系统资源,使用完毕必须关闭。JDK7+ 推荐使用 try-with-resources 自动关闭实现
AutoCloseable的流。 -
异常体系 所有 IO 操作均抛出受检异常
IOException,必须显式捕获或抛出。
五、IO 流的典型应用场景
- 文件读写、复制、移动、删除
- 网络 Socket 数据收发
- 对象序列化与持久化存储
- 日志记录与文本解析
- 图片、音视频等二进制数据处理
- 数据导入导出(Excel、CSV、TXT)
六、Java IO 与 NIO 区别(简要)
- 传统 IO:面向流、阻塞 IO、单向传输、数据处理简单
- NIO:面向缓冲区、非阻塞 IO、多路复用、高并发网络编程