当前位置: 首页 > 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处理进程)
在这里插入图片描述

http://www.dtcms.com/a/32351.html

相关文章:

  • 大模型本地部署对于硬件配置要求太高,云端运行又担心数据泄露,有什么办法可以避免数据泄露又能够运行比较大的模型吗
  • 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
  • 【服务器与本地互传文件】远端服务器的Linux系统 和 本地Windows系统 互传文件
  • 对网络物理层芯片LAN8720A的复位信号(复位引脚nRST)的详细分析(顺便也介绍下其软复位的操作和导常情况解决方法)
  • AMBA-CHI协议详解(十八)
  • [论文解析]OmniRe: Omni Urban Scene Reconstruction
  • Java中的Stream API:从入门到实战
  • C#初级教程(5)——解锁 C# 变量的更多奥秘:从基础到进阶的深度指南
  • GPIO外设
  • Python数据类型 NoneType和唯一实例None
  • 25轻化工程研究生复试面试问题汇总 轻化工程专业知识问题很全! 轻化工程复试全流程攻略 轻化工程考研复试真题汇总
  • brew Nushell mac升级版本