当前位置: 首页 > news >正文

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

文章目录

  • `分类`
  • `字节流`
    • 输入流
    • 输出流
  • `字符流`
    • 输入流
    • 输出流
  • `字节缓冲流`
  • `字符缓冲流`
  • `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处理进程)
在这里插入图片描述

相关文章:

  • 大模型本地部署对于硬件配置要求太高,云端运行又担心数据泄露,有什么办法可以避免数据泄露又能够运行比较大的模型吗
  • ubuntu 源码编译ffmpeg
  • 大模型提示词工程实战
  • Linux中的查看命令
  • kkFileView报错no office manager available
  • 【数电笔记】第一章 数制和码制
  • 计算机毕业设计SpringBoot+Vue.js学生读书笔记共享(源码+LW文档+PPT+讲解+开题报告)
  • 【微服务】深入解析spring aop原理
  • 【0409】Postgres内核 CREATE DATABASE 之 从 new_record[] 加载 tuple 数据部分 到 堆空间指定区域 ⑥
  • 机器翻译与语音识别技术:推动人机交互的新篇章
  • Java数据结构_一篇文章搞定java对象的比较_7
  • 基于Weber和simulink的齿轮啮合刚度计算
  • 基于深度学习与知识图谱的设备智能维护系统KGPHMAgent
  • PHP2(WEB)
  • Redission可重试、超时续约的实现原理
  • C++:dfs,bfs各两则
  • kotlin的Int类型调用toString()会导致空指针吗
  • CountDownlatch实现原理
  • 1.2.2 AI 技术的融入
  • Linux 文件的三个时间:Access、Modify 和 Change
  • 夜读丨读《汉书》一得
  • 从《让·桑特伊》到《追忆》,假故事的胜利
  • 广东早熟荔枝“抢滩”上海,向长三角消费者喊话:包甜,管够
  • 习近平致电祝贺阿尔巴尼斯当选连任澳大利亚总理
  • 万科:存续债券均正常付息兑付
  • 影子调查丨三名“淘金客”殒命雪峰山:千余废弃金矿洞的监管难题