Java中IO分类:
BIO - Blocking IO - 同步阻塞式IO
NIO - New IO - NonBlocking IO - 同步非阻塞式IO (JDK1.4之后)
NIO在使用的时候可以基于事件驱动方式来实现
AIO - Asynchronous IO - 异步阻塞式IO(JDK1.7之后)
AIO基于NIO进行了改进,也把AIO称之为NIO.2;因为NIO出现时间比较早,所以市面上很多框架的底层都是基于NIO构建,对NIO进行了改进,导致AIO在市面上的占有率并不高。
两组概念:
传统IO(BIO)的缺陷:
NIO的缺点:
BIO和NIO的比较
BIO | NIO |
---|---|
同步阻塞 | 同步非阻塞 |
单向传输数据 | 可以双向传输数据 |
一对一的连接方式 | 一对多的连接方式 |
面向流操作 | 面向缓冲区操作 |
适合于请求少、长连接场景 | 适合于大量请求、短连接的场景 |
NIO的三大组件:Buffer、Channel、Selector
?
ByteBuffer:字节缓冲区,继承了Buffer类,底层是依靠字节数组来存储数据。本身是一个抽象类,需要利用其子类创建对象或者是利用其提供的allocate或者是wrap方法来创建ByteBuffer对象
重要位置:capacity >= limit >= position>= mark
重要方法
方法 | 作用 |
---|---|
allocate(int capacity) | 创建缓冲区的时候指定缓冲区容量的大小,实际上是指定缓冲区底层的字节数组的大小 |
wrap(byte[] array) | 利用传入的字节数组来构建缓冲区 |
array() | 获取缓冲区底层的字节数组 |
get() | 获取缓冲区中position位置上的字节 |
get(byte[] dst) | 将缓冲区中的数据写到传入的字节数组中 |
get(int index) | 获取指定下标上的字节 |
put(byte b) | 向position位置上放入指定的字节 |
put(byte[] src) | 向position位置上放入指定的字节数组 |
put(byte[] src, int offset, int length) | 向position位置上放入指定的字节数组的部分元素 |
put(ByteBuffer src) | 将字节缓冲区放入 |
put(int index, byte b) | 向指定位置插入指定的字节 |
capacity() | 获取容量位 |
clear() | 清空缓冲区:position = 0; limit = capacity; mark = -1; |
flip() | 反转缓冲区:limit = position; position = 0; mark = -1; |
hasRemaing() | 判断position和limit之间是否还有空余 |
limit() | 获取限制位 |
limit(int newLimit) | 设置限制位 |
mark() | 设置标记位 |
position() | 获取操作位 |
position(int newPosition) | 设置操作位 |
remaining() | 获取position和limit之间剩余的元素个数 |
reset() | 重置缓冲区:position = mark |
rewind() | 重绕缓冲区:position = 0; mark = -1 |
?
?
原文:https://www.cnblogs.com/juzhuxiaozhu/p/13221823.html