(三)NIO缓冲区Buffer类的使用

1、由于Buffer及其7个子类都是抽象类,所以不能被直接new实例化,缓冲区的创建有两种方式:

(1)allocate方式:创建一个指定容量的新数组作为缓冲区的存储空间。

(2)wrap方式:将自定义的已有数组作为缓存区的存储空间。

例:

ByteBuffer bytebuffer = ByteBuffer.allocate(200);

ByteBuffer bytebuffer = ByteBuffer.wrap(new byte[] {1,2,3});

 

2、缓冲区中存在4个核心技术点:

(1)capacity(容量):缓冲区包含元素的数量,它不能为负数,也不能更改。

(2)limit(限制):代表第一个不应该读取或写入元素的index。

(3)position(位置):代表下一个要读取或写入元素的index。

(4)mark(标记):一个index,非必须设置,不能大于position,如果大于则mark被丢弃(值为-1)。

它们之间的大小关系:0 <= mark <= position <= limit <= capacity

 

3、capacity相关

int capacity():返回此缓冲区的容量。

 

4、limit相关

(1)int limit():返回此缓冲区的限制。

(2)Buffer limit(int newLimit):设置此缓冲区的限制。

(3)limit的使用场景是当反复向缓冲区中存储数据时,可以设置limit来限制读取数据的范围。

 

5、position相关

(1)int position():返回此缓冲区的位置。

(2)Buffer position(int newPosition):设置此缓冲区新的位置。

(3)int remaining():返回缓冲区剩余空间大小,即limit - position

 

6、mark相关

(1)Buffer mark():在此缓冲区的位置设置标记。

(2)Buffer reset():将缓冲区的position重置为mark。如果未定义mark,则调用此方法时会抛出InvalidMarkException异常。

 

7、直接缓冲区和非直接缓冲区

(1)allocateDirect(int capacity):创建直接缓冲区,将缓冲区建立在物理内存中。

(2)allocate(int capacity):创建非直接缓冲区,将缓冲区建立在JVM内存(堆内存)中。

(3)非直接缓冲区需要应用程序通过JVM内存和物理内存交互来读取数据,而直接缓冲区则是应用程序和操作系统直接通信,提高程序运行的效率。

 

非直接缓冲区:

 

 

直接缓冲区:

 

 

8、duplicate()方法(复制缓冲区)和slice()方法(截断缓冲区)都会创建新的缓冲区对象,但是新缓冲区使用的还是原缓冲区中的数组来存储数据,所以任一缓冲区内容的变更互相可见。

posted on 2019-06-29 11:02  逍遥1989  阅读(256)  评论(0)    收藏  举报