NIO.md

2022-08-22
0 741

----------------- | ------ |
| 面向缓冲区(Buffer) | 面向流 |
| 非阻塞 | 阻塞 |
| 选择器 | |

NIO三大核心

缓冲区(Buffer)

一个用于特定基本数据类型的容器,所有缓冲区都是Buffer抽象类的子类。Buffer主要用于与NIO通道进行叫欧胡,数据从通道读入缓冲区,从缓冲区写入通道中。

image-20210602160048773

Buffer类及其子类
  • ByteBuffer
  • CharBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer

上述类都采用相似的方法管理数据,只是各自管理的数据类型不同。

缓冲区的基本属性

Buffer中的重要概念:

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

标记、位置、限制、容量遵守:0 <= mark <= position <= limit <= capacity

图示:

1、通过allocate(10)分配容量为10的缓冲区

image-20210602161411248

2、调用put方法写入5个数据到缓冲区

image-20210602161951745

3、通过filp()切换读数据模式

image-20210602162109127

Buffer常见方法
Buffer clear(); // 清空缓冲区并返回对缓冲区的引用
Buffer flip(); // 将缓冲区的界限设置为当前位置,并将当前位置设置为0
int capacity(); // 返回Buffer的capacity大小
boolean hasRemaining(); // 判断缓冲区中是否还有元素
int limit(); // 返回Buffer的界限(limit)位置
Buffer limit(int n); // 将缓冲区界限设置为n,并返回一个具有新limit的缓冲区对象
Buffer mark(); // 对缓冲区设置标记
int position(); // 返回缓冲区的当前位置
Buffer position(int n); // 将设置缓冲区的当前位置为n,并返回修改后的Buffer对象
int remaining(); // 返回position和limit之间的元素个数
Buffer reset();// 将位置positin转到以前设置的mark所在位置
Buffer rewind(); // 将位置设为0,取消设置的mark
缓冲区的数据操作
// Buffer对所有子类提供了两个用于数据操作的方法:get()和put()
get(); // 读取单个字节
get(byte[] dst); // 批量读取多个字节到dst中
get(int index); // 读取指定索引位置的字节(不会移动position)

put(byte b); // 将给定单个字节写入缓冲区的当前位置
put(byte[] src); // 将src中的字节写入缓冲区的当前位置
put(int index, byte b); // 将指定字节写入缓冲区的索引位置(不会移动positioon)

使用Buffer读写数据四个步骤

  • 1、写入数据到buffer
  • 2、调用filp方法,转换为读取模式
  • 3、从buffer中读取数据
  • 4、调用clear或者compact方法清除缓冲区
案例