Java中的IO-NIO

送分小仙女□ 提交于 2020-02-19 04:57:23
首先Java中的IO有以下三种:
BIO(Blocking IO)  同步式阻塞IO
NIO(Non-BlockingIO/New IO)  同步式非阻塞IO   JDK1.4提供 
AIO(AsynchronousIO)  异步式非阻塞IO  JDK1.8提供

BIO vs NIO

BIO NIO
一对一连接 一对多连接
线程阻塞 线程非阻塞
单向传输 双线传输
适用请求少,长连接的场景 适用于请求多,短连接的场景

NIO
NIO是jdk1.4提供的用于数据传输的流。主要有三大组件:
⚪ Buffer
⚪ Channel
⚪ Selector

1.Buffer 缓冲区
Buffer是用于存储数据的容器,在内存中占了一块连续的空间,本质上是一个数组,Java中针对基本类型提供了不同的的缓冲区(没有Boolean),ByteBuffer(字节缓冲区)是最基本的缓冲区。
ByteBuffer 继承了Buffer类,底层是靠字节数组来存储数据,是一个抽象类,需要用其子类创建对象,或者用提供的allocate/wrap方法来创建对象
重要的位置(4个):capacity>=limit>=position>=mark
capacity:容量位,表示缓冲区容量,创建好后不再改变
limit:限制位,用于限制操作(position)时能达到的最大位置,缓冲区刚创建时位于capacity位置
position:操作位,表示当前操作的位置,缓冲区刚创建时位于0
mark:标记位,用于操作过程中标记,缓冲区刚创建时位于-1,默认不开启
常用的API:
在这里插入图片描述
2. Channel通道
用于数据传输,面向缓冲区,可以实现双向传输。
channel默认是阻塞的,需要手动调整成非阻塞。
三种类型:
1)FileChannel:面向文件的通道,用于对文件的读写
2)UDP:用于进行UDP收发的通道,是无连接的网络协议,只能进行发送和接受的操作。基本类是DatagramChannel,是一个抽象类。
3)TCP:用于TCP的通信通道,有连接的网络协议,可以进行连、接、读、写操作。客户端通道时SocketChannel,服务器通道是ServerSocketChannel。

  1. Selector 多路复用选择器
    对通道进行选择,需要基于事件来驱动。主要是四类事件:connect、accept、read、write,全部定义在SelectionKey中。
    可以实现利用一个和少量线程完成大量请求的的场景,不适用于长任务场景,并且selector只是针对非阻塞的通道的。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!