Java IO 流详解:从分类到实践
在 Java 编程中,输入输出(IO)是程序与外部世界交互的核心能力 —— 无论是读取配置文件、处理网络数据,还是操作数据库,都离不开 IO 流的身影。但 IO 流体系庞大、类繁多,新手往往容易混淆。本文将从分类角度梳理 Java IO 流的核心体系,帮你建立清晰的知识框架。
一,流的划分:
按传输方式:
1. 字节流(InputStream,QutputStream):按照字节传输,机器可以自动识别内容,处理的是二进制文件,比如图片,np3等。
2.字符流(Reader,Writer): 按照字符传输,处理的是文本文件,可以可以看做特殊的二进制文件,通过编码格式可以直接阅读。
按数据划分:
1.常用的是文件流(FilelputStream,FileOutputStream等),
2.字节数组(ByteArraylnputStream,ByteArrayOutputStream),
3.字符数组流(CharArrayReader,CharArrayWriter),
4.转换流(InputStreamReader,OutputStreamWriter)等。
二、IO 流的本质:数据传输的 "管道"
在 Java 中,"流(Stream)" 是对数据传输的抽象 —— 就像水管运输水,IO 流负责在程序与外部设备(文件、网络、内存等)之间传输数据。流的特性是单向流动:数据要么从外部流入程序(输入流),要么从程序流向外部(输出流),这是理解 IO 流的基础。
三、IO 流的核心分类方式
Java IO 流可以从数据流向、处理数据单位、流的角色三个维度分类,三者相互交叉,共同构成了 IO 流的体系。
1. 按数据流向划分:输入流 vs 输出流
这是最直观的分类方式,以 "程序" 为参照物判断流向:
-
输入流(Input):数据从外部设备流向程序,用于 "读取" 数据。核心基类:
- 字节输入流:
InputStream(抽象类,所有字节输入流的父类) - 字符输入流:
Reader(抽象类,所有字符输入流的父类)
- 字节输入流:
-
输出流(Output):数据从程序流向外部设备,用于 "写入" 数据。核心基类:
- 字节输出流:
OutputStream(抽象类,所有字节输出流的父类) - 字符输出流:
Writer(抽象类,所有字符输出流的父类)
- 字节输出流:
2. 按处理数据单位划分:字节流 vs 字符流
这是区分 IO 流功能的关键,决定了流能处理的数据类型:
(1)字节流:处理所有数据类型
- 单位:以字节(8 位二进制)为单位传输数据。
- 适用场景:可处理任意类型数据(文本、图片、音频、视频等二进制数据)。
- 核心基类:
- 输入:
InputStream - 输出:
OutputStream
- 输入:
- 常见实现类:
FileInputStream/FileOutputStream:读写文件的字节流BufferedInputStream/BufferedOutputStream:带缓冲区的字节流(提升效率)ByteArrayInputStream/ByteArrayOutputStream:操作字节数组的流
(2)字符流:专为文本设计
- 单位:以字符(16 位 Unicode)为单位传输数据,本质是对字节流的 "包装",自动处理字符编码(如 UTF-8、GBK)。
- 适用场景:仅用于处理文本数据(.txt、.java 等),避免字节流处理文本时的乱码问题。
- 核心基类:
- 输入:
Reader - 输出:
Writer
- 输入:
- 常见实现类:
FileReader/FileWriter:读写文件的字符流(简化版,默认编码)BufferedReader/BufferedWriter:带缓冲区的字符流(支持一行一行读写)InputStreamReader/OutputStreamWriter:字节流与字符流的转换桥梁(可指定编码)
3. 按流的角色划分:节点流 vs 处理流
从功能上看,流可分为直接操作数据源头的 "节点流",和增强节点流功能的 "处理流":
(1)节点流(低级流)
- 特点:直接连接数据源(如文件、内存、网络),是 IO 操作的 "基础管道"。
(2)处理流(高级流)
- 特点:不直接连接数据源,而是 "包裹" 节点流或其他处理流,增强功能(如缓冲、转换、序列化等)。
- 优势:简化操作(如缓冲流自动批量读写)、扩展功能(如对象流实现序列化)。
四、IO 流体系图:一目了然的类关系
为了更直观理解,整理核心类的继承关系如下:
字节流体系:
InputStream(基类)
├─ FileInputStream(文件节点流)
├─ BufferedInputStream(缓冲处理流)
├─ ObjectInputStream(对象处理流)
└─ ...
OutputStream(基类)
├─ FileOutputStream(文件节点流)
├─ BufferedOutputStream(缓冲处理流)
├─ ObjectOutputStream(对象处理流)
└─ ...
字符流体系:
Reader(基类)
├─ FileReader(文件节点流,简化版)
├─ BufferedReader(缓冲处理流)
├─ InputStreamReader(字节转字符处理流)
└─ ...
Writer(基类)
├─ FileWriter(文件节点流,简化版)
├─ BufferedWriter(缓冲处理流)
├─ OutputStreamWriter(字符转字节处理流)
└─ ...
五、实践建议:如何选择合适的 IO 流?
-
优先根据数据类型选字节流 / 字符流:
- 处理文本(如.txt、.csv):用字符流(避免乱码),推荐
BufferedReader/BufferedWriter。 - 处理非文本(如图片、视频):必须用字节流,推荐
BufferedInputStream/BufferedOutputStream。
- 处理文本(如.txt、.csv):用字符流(避免乱码),推荐
-
善用处理流提升效率:
- 缓冲流(
BufferedXXX)能减少 IO 次数,几乎所有场景都建议搭配节点流使用。 - 转换流(
InputStreamReader)在需要指定编码(如 UTF-8)时必用(FileReader默认编码可能导致乱码)。
- 缓冲流(
-
注意资源关闭:
- 流属于 "非内存资源",必须手动关闭(Java 7 + 可用
try-with-resources自动关闭)。
- 流属于 "非内存资源",必须手动关闭(Java 7 + 可用
六、总结
Java IO 流的分类本质是从不同角度描述流的特性:
- 流向决定 "读 / 写",单位决定 "处理数据类型",角色决定 "功能层次"。

956

被折叠的 条评论
为什么被折叠?



