Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Moosphan opened this issue Jun 24, 2019 · 4 comments
Open
Labels

Comments

@Moosphan
Copy link
Owner

No description provided.

@Moosphan Moosphan added the Java label Jun 24, 2019
@Shanlovana
Copy link
Collaborator

抛砖引玉

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开始支持。

@gabyallen
Copy link

gabyallen commented Jun 24, 2019

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

@yangfanggang
Copy link

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

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

@dahuoyzs
Copy link

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模型?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants