概述
I/O指的是Input/Output的缩写,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。内部存储器可以看做是CPU和主存(有一种说法是CPU及其寄存器才是内部存储器,CPU和主存之间的数据传输也被看做I/O,但CPU和主存的存储速度相差不大,所以一般都会把CPU和主存整体看做内部存储器)。
I/O流就是指数据在内部存储器和外部存储器或其他周边设备之间输入和输出产生的数据流,包括了数据的流向。流向是以程序(CPU和主存)为参照物,数据从程序输出到其他节点称为输出流,数据从其他节点输入到程序称为输入流,可以把I/O流想象成水流,水就是其中的数据(字节),水的流动方向就是数据(字节)输入/输出的方向。
java的i/o流家族
先上两张图感受一下庞大的I/O流家族和没有严格执行计划生育的后果。
对于这么庞大的家族,第一反应肯定是
莫慌,现在就一层一层一层剥开它们的外衣,下面我们就对这些家族成员起底!
在java中,流可以按几个维度分类:
- 按流向分类——输入流,输出流
- 按操作数据单位分类——字节流,字符流
- 按角色分类——节点流,处理流
当这些分类两两组合,就形成了java的io流家族
其中InputStream、OutputStream、Reader、Writer是所有流的基类
字节流 | 字符流 | |
---|---|---|
输入流 | InputStream |
Reader |
输出流 | OutputStream |
Writer |
这4个基类是输入流、输出流和字节流、字符流的两两组合,当这4个基类与不同节点的节点流,不同功能的处理流再进行组合时,就形成了java的IO流体系
字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 | |
---|---|---|---|---|
抽象基类 | InputStream |
OutputStream |
Reader |
Writer |
访问文件 | FileInputStream |
FileOutputStream |
FileReader |
FileWriter |
访问数组 | ByteArrayInputStream |
ByteArrayOutputStream |
CharArrayReader |
CharArrayWriter |
访问管道 | PipedInputStream |
PipedOutputStream |
PipedReader |
PipedWriter |
访问字符串 | StringReader |
StringWriter |
||
缓冲流 | BufferedInputStream |
BufferedOutputStream |
BufferedReader |
BufferedWriter |
转换流 | InputStreamReader |
OutputStreamWriter |
||
对象流 | ObjectInputStream |
ObjectOutputStream |
||
FilterInputStream |
FilterOutputStream |
FilterReader |
FilterWriter |
|
打印流 | PrintStream |
PrintWriter |
||
推回输入流 | PushbackInputStream |
PushbackReader |
||
特殊流 | DataInputStream |
DataOutputStream |
节点流
程序用于直接操作目标设备所对应的类叫节点流。节点流也按目标设备的不同分为几类:
目标设备 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
文件 | FileInputStream |
FileOutputStream |
FileReader |
FileWriter |
内存 | ByteArrayInputStream |
ByteArrayOutputStream |
CharArrayReader |
CharArrayWriter |
StringReader |
StringWriter |
|||
管道 | PipedInputStream |
PipedOutputStream |
PipedReader |
PipedWriter |
- 文件流: 对文件进行读写操作
- 内存流: 从/向内存数组或字符串读/写数据
- Pipe管道流: 实现管道的输入和输出(进程间通信)
处理流
程序通过一个间接流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是处理流。处理流也可以按不同功能划分:
功能 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
缓冲 | BufferedInputStream |
BufferedOutputStream |
BufferedReader |
BufferedWriter |
过滤 | FilterInputStream |
FilterOutputStream |
FilterReader |
FilterWriter |
打印 | PrintStream |
PrintWriter |
||
转换 | InputStreamReader |
OutputStreamWriter |
I/O流体系的设计思想
装饰模式
我们上面对流家族的各个类进行了分类,但还没说清楚为什么要这样设计,首先得知道I/O流体系的基石——装饰模式,下图以OutputStream为例反映了各个IO类充当了装饰模式的哪个角色
所以IO系统的用法一般是叠合多个流对象来完成任务:
new <处理流对象>(new <处理流对象>(new <节点流对象>))
节点流对象负责定义端点,然后用多个处理流对象组合来完成不同的功能