一.概述
1.基本概念
什么是IO?
因为执行速度的不同,计算机存储设备会分为多个类(内存,磁盘,u盘…)
I/O就是在不同存储设备间将数据写入写出的过程
什么是流?
通过流,可以使java程序访问不同的输入输出源
字节流/字符流
字节流转换字符流耗时,并且容易出现乱码,针对字符操作新增字符流。
字节流/字符流使用场景
字节流:音频,图片,文件
字符流:字符
同步/异步 阻塞/非阻塞
同步:任务B必须等待任务A结束才可以执行,任务A只在执行结束后得到结果
异步:任务A开始执行立即返回,执行结束后通过事件或者其他方式通知结果
阻塞:发起请求后等待执行结果
非阻塞:发起请求后不等待执行结果
同步/异步是从行为角度描述事物的,而阻塞和非阻塞描述的当前事物的状态
2.分类
流的方向(从内存角度出发) | 输入流 | 输出流 |
---|---|---|
操作单元 | 字节流 | 字符 |
流的角色 | 节点流 | 处理流 |
java I/O共有40多种,都是从以下4个基类延伸而来的
- InputStream 字节输入流
- OutputStream 字节输出流
- Reader 字符输入流
- Writer 字符输出流
二.AIO,BIO,NIO
java语言对各种I/O模型的封装,可以适配不同的操作系统
- BIO
- 同步阻塞IO
- 数据的读取和写入必须阻塞同一个线程直到完成
- 适用于连接数不高的情况下
- NIO
- 非同步阻塞IO JDK1.4提出
- 面向缓冲,基于通道的I/O操作方式
- AIO
- 异步,非阻塞IO
- 基于事件,回调机制完成
- 目前应用还不是很广泛