【IO】java IO流的类型及IO模型

分类

根据数据流向分为:输入流、输出流(以内存为中心,输入内存的为输入流,从内存输出的为输出流)

根据数据处理方式分为:字节流、字符流

字节流

输入流

  • 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处理进程)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值