文章目录
- `分类`
- `字节流`
- 输入流
- 输出流
- `字符流`
- 输入流
- 输出流
- `字节缓冲流`
- `字符缓冲流`
- `4中常见的IO模型`
- BIO(同步阻塞模型)
- 同步非阻塞模型
- NIO(多路复用模型)
- AIO异步
分类
根据数据流向分为:输入流、输出流(以内存为中心,输入内存的为输入流,从内存输出的为输出流)
根据数据处理方式分为:字节流、字符流
字节流
输入流
- InputStream
- FileInputStram(InputStream 子类)
- DataInputStream:用于读取指定类型数据,不能单独使用,必须结合其他流
- ObjectInputStream:用于读取Java对象(反序列化)
输出流
- OutputStream
- FileOutputStream(OutputStream 子类)
- DataOutputStream:用于写入指定类型数据,不能单独使用,必须结合其他流
- ObjectOutputStream:用于写入Java对象(序列化)
字符流
信息的最小存储单位是字节,引入字符流操作的原因:
在UTF-8中,英文占1字节,中文占3字节,如果采用字节流读取中文,会产生乱码现象,故引入字符流,方便对字符进行流操作。如果是音频、图片等媒体文件仍然使用字节流,如果使用字符流,会有数据丢失的情况。
输入流
- Reader
- InputStreamReader:字节流转换为字符流的桥梁。
- FileReader
输出流
- Writer
- OutputStreamWriter:字符流装换位字节流的桥梁
- FileWriter
字节缓冲流
IO操作时消耗性能的,缓冲流将数据加载至缓冲区中,一次可以读取/写入多个字节,避免了频繁的IO操作,提高效率。
字节流和字节缓冲流性能提升主要是在read(),write(int b)读取/写入一个字节的方法上。因为,字节缓存流会将读取的字节放在缓存区,减少IO的次数。
但如果使用的是read(byte[] bytes),write(byte[] bytes)这两个方法,字节流和字节缓冲流的性能提升就不明显了。
- BufferedInputStream
- BufferedOutputStream
字符缓冲流
- BufferedReader
- BufferedWriter
4中常见的IO模型
同步阻塞I/O
同步非阻塞I/O
I/O多路复用
信号驱动I/O
异步I/O
BIO(同步阻塞模型)
同步阻塞 IO 模型中,应用程序发起 read 调用后,会一直阻塞,直到内核把数据拷贝到用户空间。
缺点:读取整个过程都是阻塞的,需要进行频繁的线程创建、切换。
同步非阻塞模型
同步非阻塞 IO 模型中,应用程序会一直发起 read 调用(轮询操作,避免阻塞),等待数据从内核空间拷贝到用户空间的这段时间里,线程依然是阻塞的,直到在内核把数据拷贝到用户空间。
缺点:频繁的调用read(),消耗CPU资源。
NIO(多路复用模型)
IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间 -> 用户空间)还是阻塞的。
AIO异步
异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。(不关心IO处理进程)