Java BIO/NIO/AIO解读

Java IO流

1.I/O模型:

就是用什么样的通道或者说是通信模式和架构进行数据的传输和接受,很大程度上决定了程序通信的性能,Java共支持3种网络编程的I/O模型:BIO/NIO/AIO

1.1BIO

同步阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销
在这里插入图片描述

1.2NIO

同步非阻塞,服务器实现模式为一个线程处理多个请求,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理在这里插入图片描述

1.3AIO

异步 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS(操作系统)先完成了再通知服务器应用启动线程进行处理,一般适用于连接数较多且连接时间较长的应用

2.BIO/NIO/AIO 适用场景分析
2.1.BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中
2.2.NIO方式适用于连接数目多且连接比较短的架构,比如聊天服务器,弹幕系统,服务器间通讯。
2.3.AIO方式适用于连接数目多且连接较长的架构,比如相册服务器,充分调用OS参与并发操作。
3.BIO基本介绍
  • Java BIO就是传统的java io 编程,其相关的类和接口在java.io

  • 同步阻塞,服务器模式为一个连接一个线程,客户端有连接服务器端就启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善

    代码演示:socket编程就是最好的案列

4.NIO基本介绍
  • NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的,基于通道的IO操作。NIO可以理解为非阻塞IO,NIO中可以配置socket为非阻塞模式。
  • NIO相关的类都放在java.nio包及包下,并且对原java.io包中的很多类进行改写。
  • NIO有三大核心部分:Channel(通道),Buffer(缓冲区),Selector(选择器)
  • NIO可以做到用一个线程来处理多个操作的,假设有1000个请求过来,根据实际情况分配20或者80个线程来处理。不会像阻塞IO,非得分配1000个。
4.1NIO和BIO的比较
  • BIO以流的方式处理数据,而NIO以块的方式处理数据,块I/O的效率比流I/O高很多

  • BIO是阻塞的,NIO则是非阻塞的

  • BIO基于字节流和字符流进行操作,而NIO基于 Channel(通道)和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可监听多个客户端通道

NIOBIO
面向缓冲区(Buffer)面向流(Stream)
非阻塞(Non Blocking IO)阻塞IO(Blocking IO)
选择器(Selectors)
4.2.NIO三大核心原理示意图

Channel(通道) Buffer(缓冲区) Selector(选择器)

Buffer 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer 对象,并提供了一组方法,用来方便的访问该块内存。相比较直接对数组的操作,Buffer API更加容易操作和管理。

Channel(通道) NIO的通道类似流,但又有些不懂:既可以从通道中读取数据,又可以写数据到通道。但流的(input或output)读写通常是单向的。通道可以非阻塞读取和写入通道,通道可以支持读取或写入缓冲区,也支持异步地读写。

Selector (选择器)是一个Java NIO组件,可以能够检查一个或多个NIO通道,并确定哪些通道已经准备好进行读取或写入。这样,一个单独的线程可以管理多个channel,从而管理多个网路连接,提高效率。
在这里插入图片描述

4.3.NIO核心一:缓冲区

一个用于特定基本数据类型的容器。由java.nio包定义,所有缓冲区 都是Buffer抽象类的子类。Java NIO中的Buffer 主要用于与NIO通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的。
在这里插入图片描述

缓冲区的基本属性

  • 容量: 作为一个内存快,Buffer具有一定的固定大小,也称为“容量”,缓冲区容量不能为负,并且创建后不能更改。
  • **限制:**表示缓冲区中可以操作数据的大小,缓冲区的限制不能为负,并且不能大于其容量。写入模式,限制等于buffer的容量。读取模式下,limit等于写入的数据量。
  • 位置: 下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制。
  • **标记与重置:**标记是一个索引,通过buffer中的mark()方法,指定buffer中一个特定的position,之后可以通过调用reset()方法恢复到这个position.
4.4.NIO核心二:通道

**概述:**由java.nio.channels包定义的。Channel表示IO源与目标打开的连接。Channel类似于传统的“流”。只不过Channel本身不能直接访问数据,Channel只能与Buffer进行交互。

  • 通道可以同时进行读写,而流只能读或者只能写
  • 通道可以实现异步读写数据
  • 通道可以从缓冲读数据,也可以写数据到缓冲。
4.5.NIO核心三:选择器

概述:选择器是SelectableChannle对象的多路复用器,Selector可以同时监控多个SelectableChannel的Io状况,也就是说,利用Selector可使一个单独的线程管理多个Channel,Selector是非阻塞IO的核心

  • Java的NIO,用非阻塞的IO方式,可以用一个线程,处理多个的客户端连接,就会使用到Selector
  • Selector能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的处理,这样就可以只用一个单线程去管理多个通道,也就是管理多个连接和请求。
5.AIO基本介绍
  • Java AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了在通知服务器应用去启动线程进行处理。(少)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值