一.概述

1.基本概念

什么是IO?

因为执行速度的不同,计算机存储设备会分为多个类(内存,磁盘,u盘…)
I/O就是在不同存储设备间将数据写入写出的过程

什么是流?

通过流,可以使java程序访问不同的输入输出源

字节流/字符流

字节流转换字符流耗时,并且容易出现乱码,针对字符操作新增字符流。

字节流/字符流使用场景

字节流:音频,图片,文件
字符流:字符

同步/异步 阻塞/非阻塞

同步:任务B必须等待任务A结束才可以执行,任务A只在执行结束后得到结果
异步:任务A开始执行立即返回,执行结束后通过事件或者其他方式通知结果

阻塞:发起请求后等待执行结果
非阻塞:发起请求后不等待执行结果

同步/异步是从行为角度描述事物的,而阻塞和非阻塞描述的当前事物的状态

2.分类

流的方向(从内存角度出发) 输入流 输出流
操作单元 字节流 字符
流的角色 节点流 处理流

java I/O共有40多种,都是从以下4个基类延伸而来的

  1. InputStream 字节输入流
  2. OutputStream 字节输出流
  3. Reader 字符输入流
  4. Writer 字符输出流

image.png
image.png

二.AIO,BIO,NIO

java语言对各种I/O模型的封装,可以适配不同的操作系统

  1. BIO
    1. 同步阻塞IO
    2. 数据的读取和写入必须阻塞同一个线程直到完成
    3. 适用于连接数不高的情况下
  2. NIO
    1. 非同步阻塞IO JDK1.4提出
    2. 面向缓冲,基于通道的I/O操作方式
  3. AIO
    1. 异步,非阻塞IO
    2. 基于事件,回调机制完成
    3. 目前应用还不是很广泛