Java IO流
一、什么是I/O流?核心概念解析
- I/O流(Input/Output Stream)
是Java中用于在程序与外部设备(文件、网络、内存等)间传输数据的抽象机制。“流”(Stream)类比水流,代表数据的单向、有序、无结构字节序列。
- 输入流(InputStream/Reader):数据从外部流向程序(如读取文件)。
- 输出流(OutputStream/Writer):数据从程序流向外部(如写入文件)。
- 核心目的:屏蔽底层设备差异,提供统一操作接口。
二、流的分类与作用
1. 按数据类型分
类型 |
单位 |
适用场景 |
核心类 |
特点 |
字节流 |
字节 (8bit) |
二进制文件(图片、视频) |
InputStream /OutputStream |
直接操作原始字节,无编码转换。 |
字符流 |
字符 (Unicode) |
文本文件(.txt, .csv) |
Reader /Writer |
自动处理字符编码(如UTF-8),避免乱码。 |
2. 按功能角色分
类型 |
功能 |
典型实现类 |
作用 |
节点流 |
直接连接数据源/目标 |
FileInputStream , FileWriter |
基础读写操作。 |
处理流(包装流) |
增强节点流功能 |
BufferedInputStream , BufferedReader |
添加缓冲、数据转换等高级功能。 |
三、I/O流的核心应用场景
- 文件操作
- 读写文本/二进制文件(如日志记录、配置文件解析)。
- 示例:
FileReader
读文本,FileOutputStream
写图片。
- 网络通信
- 内存数据处理
ByteArrayInputStream
/ByteArrayOutputStream
处理内存字节数据。
- 对象序列化
ObjectOutputStream
将对象转为字节流持久化存储。
- 线程间通信
PipedInputStream
/PipedOutputStream
实现管道传输。
四、流的使用方法:关键步骤与最佳实践
1. 基础操作流程
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
try (FileOutputStream fos = new FileOutputStream("output.dat");
BufferedOutputStream bos = new BufferedOutputStream(fos)) {
byte[] data = {
0x48, 0x65, 0x6C, 0x6C, 0x6F};
bos.write(data);
} catch (IOException e) {
e.printStackTrace();
}
关键点:
- 资源释放:使用
try-with-resources
(Java 7+)自动关闭流,避免资源泄漏。
- 缓冲机制:用
BufferedXXX
包装流减少磁盘I/O次数,提升性能(尤其大文件)。
2. 字节流 vs 字符流的选择
3. 高级功能应用