目录
核心概念
IO :Input/Output,程序与外部(文件、网络、控制台)的数据传输。
流(Stream) :单向、有序、字节 / 字符序列,像水管:
- 输入流:外部 → 程序(读)
- 输出流:程序 → 外部(写)
设计模式 :装饰者模式 ------ 节点流(如FileInputStream)被处理流(如BufferedInputStream)包装,动态增功能。
包 :java.io
特点:
- 顺序访问:数据按顺序读取/写入,不能随机访问
- 单向流动:输入流用于读取数据,输出流用于写入数据
- 基于字节或字符:支持原始字节和字符数据
- 可关闭性:流操作涉及系统资源,使用后必须关闭,否则会导致资源泄漏
IO流分类
按数据单位(最核心)
- 字节流(Byte Stream) :处理二进制数据
- 基类:
InputStream(输入)、OutputStream(输出) - 单位:1 byte(8 bit)
- 用途:所有类型数据(文本、图片、视频、音频、压缩包)
- 基类:
- 字符流(Character Stream)
- 基类:
Reader(输入)、Writer(输出) - 单位:1 char(2 byte,Unicode)
- 用途:纯文本 (.txt/.java/.md),自动处理编码(UTF-8/GBK),避免中文乱码
- 基类:
按流向
- 输入流 :
InputStream/Reader子类 - 输出流 :
OutputStream/Writer子类
按角色(节点 / 处理)
- 节点流(低级流) :直接对接数据源(文件、内存),如
FileInputStream、FileReader - 处理流(高级流) :包装节点流 ,增强功能(缓冲、序列化、过滤),如
BufferedReader、ObjectOutputStream
按功能分类
- 文件流 :直接操作文件的流,如
FileInputStream - 缓冲流 :提供缓冲功能,提升读写效率,如
BufferedReader - 转换流 :实现字节流与字符流的转换,如
InputStreamReader - 数据流 :读写基本数据类型,如
DataInputStream - 对象流 :实现对象的序列化与反序列化,如
ObjectInputStream - 打印流 :方便输出数据,如
PrintStream、PrintWriter
四大抽象基类
InputStream(输入)、OutputStream(输出)
Reader(输入)、Writer(输出)
大基类均为抽象类,不能直接 new,只能用子类。
字节流体系核心类继承关系如下:
bash
InputStream
├─ FileInputStream(文件输入流)
├─ BufferedInputStream(缓冲输入流)
├─ DataInputStream(数据输入流)
├─ ObjectInputStream(对象输入流)
├─ ByteArrayInputStream(字节数组输入流)
└─ ...
OutputStream
├─ FileOutputStream(文件输出流)
├─ BufferedOutputStream(缓冲输出流)
├─ DataOutputStream(数据输出流)
├─ ObjectOutputStream(对象输出流)
├─ ByteArrayOutputStream(字节数组输出流)
└─ ...
// 字符流体系
Reader
├─ FileReader(文件读取器)
├─ BufferedReader(缓冲读取器)
├─ InputStreamReader(字节转字符输入流)
├─ CharArrayReader(字符数组读取器)
└─ ...
Writer
├─ FileWriter(文件写入器)
├─ BufferedWriter(缓冲写入器)
├─ OutputStreamWriter(字符转字节输出流)
├─ CharArrayWriter(字符数组写入器)
└─ ...
常用流类与用途
- 字节流常用子类
- 节点流
FileInputStream:读文件(字节)FileOutputStream:写文件(字节)ByteArrayInputStream/ByteArrayOutputStream:内存字节数组读写
- 处理流
BufferedInputStream/BufferedOutputStream:缓冲字节流,提高效率(默认 8KB 缓冲区)DataInputStream/DataOutputStream:读写基本数据类型(int/double/boolean)ObjectInputStream/ObjectOutputStream:对象序列化 / 反序列化
- 字符流常用子类
- 节点流
FileReader:读文本文件(字符)FileWriter:写文本文件(字符)
- 处理流
BufferedReader/BufferedWriter:缓冲字符流 ,高效,支持readLine()/newLine()InputStreamReader/OutputStreamWriter:字节→字符转换流,指定编码(如 UTF-8)
关键注意事项
- 流必须关闭 :用
try-with-resources(自动关流,推荐)或finally手动关流,避免资源泄漏。 - 字节流与字符流选择:
- 非文本(图片 / 视频 / 压缩包)→ 字节流
- 纯文本 → 字符流(指定编码,防乱码)
- 缓冲流必用 :直接用节点流效率极低 ,包装
Buffered系列缓冲流,减少磁盘 IO 次数。 - 序列化:
- 实体类必须实现
Serializable接口 - 显式定义
serialVersionUID,避免类修改后反序列化失败 transient修饰的字段不参与序列化
- 实体类必须实现
IO 模型演进
- BIO(Blocking IO,传统 IO) :阻塞 + 同步,一个连接一个线程,并发低(适合小连接数)
- NIO(New IO/Non-blocking IO,JDK1.4+) :非阻塞 + 同步 + 多路复用 ,单线程管理多连接(高并发),核心:
Channel(双向通道)、Buffer(缓冲区)、Selector(选择器) - AIO(Asynchronous IO,NIO.2,JDK7+) :异步 + 非阻塞,内核完成 IO 后回调,真正异步(高并发、高吞吐)