----------------- | ------ |
| 面向缓冲区(Buffer) | 面向流 |
| 非阻塞 | 阻塞 |
| 选择器 | |
NIO
三大核心
缓冲区(Buffer)
一个用于特定基本数据类型的容器,所有缓冲区都是Buffer抽象类的子类。Buffer
主要用于与NIO
通道进行叫欧胡,数据从通道读入缓冲区,从缓冲区写入通道中。
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的缓冲区
2、调用put
方法写入5个数据到缓冲区
3、通过filp()
切换读数据模式
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方法清除缓冲区