Moosphan/Android-Daily-Interview

2019-06-24:Java 中 IO 流分为几种?BIO,NIO,AIO 有什么区别?

Moosphan opened this issue · 4 comments

2019-06-24:Java 中 IO 流分为几种?BIO,NIO,AIO 有什么区别?

抛砖引玉

IO 流分为几种

Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的.

字符流和字节流是根据处理数据的不同来区分的。字节流按照8位传输,字节流是最基本的,所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。

  • 1.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;

  • 2.节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

读文本的时候用字符流,例如txt文件。读非文本文件的时候用字节流,例如mp3。理论上任何文件都能够用字节流读取,但当读取的是文本数据时,为了能还原成文本你必须再经过一个转换的工序,相对来说字符流就省了这个麻烦,可以有方法直接读取。

字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!

BIO、NIO、AIO 有什么区别

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

BIO是一个连接一个线程。
NIO是一个请求一个线程。
AIO是一个有效请求一个线程。

  • BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
  • NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
  • AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

适用场景分析

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
  • NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
  • AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

java中io流按照流向分:可以分为输入流和输出流;
按照流的的操作单元划分:可以分为字节流和字符流;
按照流的角色划分:可以分为节点流和处理流;
BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务端需要启动一个线程并进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善;适用于并发小,适用于一些较小服务器请求。它是传统I/O流。
NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮训到连接有I/O请求时才启动一个线程进行处理。适用于并发较高场景,例如聊天服务器。它是传统升级I/O流。
AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都市由OS先完成流再通知服务器应用去启动线程进行处理。适用于连接数目较多,例如相册服务器;是NIO升级。

简单说一下IO流
根据流向可分为 输入、输出流
根据操作类型可分为 字符、字节流

BIO、NIO、AIO的区别
暂不清楚

IO最原始的又叫bio,Nio是jdk1.4出来的, Nio(NewIO)

IO是线程阻塞的,而Nio是非阻塞的。

IO主要是操作流。而Nio的核心是管道和缓存区

IO没有选择器,NIO有选择器,

选择器个人理解:作用是用来优化程序的,也在服务器端,选择器通过和多个客户端组合后,整体发送给服务端,大大提高效率,个人理解是服务器端的堵塞部分被移动到了选择器中,而服务器主程序不承担堵塞部分。

IO同步堵塞 NIO同步非堵塞(JDK1.4) AIO 异步非阻塞(JDK1.7)

推荐链接

BIO、NIO、AIO的区别

漫话:如何给女朋友解释什么是Linux的五种IO模型?