nio之缓冲区(Buffer)理解

ゝ一世哀愁。 2024-02-19 18:28 203阅读 0赞

一、缓冲区简介

Nio中的 Buffer 是用于存储特定基础类型的一个容器。为了能熟练的使用 Nio中的各种 Buffer , 我们需要理解 Buffer 中的 三个重要 的属性。

  1. capacity:表示的是这个缓冲区包含元素的个数,容量不可改变也不可是负数
  2. limit:表示的是缓冲区中第一个**不可**读的元素的索引,它不可是负数并且 <= capacity
  3. position:表示的是缓冲区中下一个元素****读或可的元素的索引,它不可是负数并且 <= limit

    0 <= position <= limit <= capacity

二、相对操作和绝对操作

相对操作:相对的读或写操作,会根据读取或写入元素的个数会直接修改Buffer 中的 position的值,比如:buffer.get()
绝对操作:直接根据索引进行操作,不会修改 Buffer 中的 position的值,比如: buffer.get(索引)。
即:直接根据索引来进行操作的是绝对操作,否则是相对操作。

三、这篇文章中用到的buffer的方法

buffer.put(数据) ===> 向 buffer 中写入数据
buffer.get() ===> 从 buffer 中获取数据
buffer.get(索引) ===> 绝对操作,获取buffer中这个索引所处于的数据,不会修改 `position`的值
buffer.flip() ===> 将 buffer 从写入操作转换成 读取操作
buffer.clear() ===> 将buffer 从读取操作转换成写入操作,`注意:`这个时候buffer中的数据并不会删除,只是修改了 position 、limit、和 mark 的值

四、Buffer 具体操作的实例

aHR0cDovL2RsMi5pdGV5ZS5jb20vdXBsb2FkL2F0dGFjaG1lbnQvMDEzMS8xMDY0LzEzZDRlNjFhLTkxNWQtMzJhOS1hMzIwLWU3ZjkzMGRmMzQ0OC5wbmc

四-1、分布详解上图中1 2 3 4各步骤中 position、 limit、和 capacity的变化

1、 分配一个新的 IntBuffer
aHR0cDovL2RsMi5pdGV5ZS5jb20vdXBsb2FkL2F0dGFjaG1lbnQvMDEzMS8xMDY2L2Y1NmI5MjhlLTJkMDYtMzI0ZC04YmEwLTA5YTc3NWYwZDQwNi5wbmc
2、 往 IntBuffer 中写入数据
aHR0cDovL2RsMi5pdGV5ZS5jb20vdXBsb2FkL2F0dGFjaG1lbnQvMDEzMS8xMDY4LzRjZDljNmUyLTMxMzEtM2UyOC1iOWExLTkxYWI1NzY0MjkyOC5wbmc
往buffer中写入数据时,会修改 `position`的值,写入的 `position <= limit`,因为limit为下一个不可读或写元素的索引。

3、 转换成读模式
aHR0cDovL2RsMi5pdGV5ZS5jb20vdXBsb2FkL2F0dGFjaG1lbnQvMDEzMS8xMDcwL2JlMzAzZWFlLWEwM2ItM2E3Zi04ZWU3LWYxZmEzY2VjYmY4Ni5wbmc

4、 获取数据
aHR0cDovL2RsMi5pdGV5ZS5jb20vdXBsb2FkL2F0dGFjaG1lbnQvMDEzMS8xMDcyLzc1MTQzYmIyLTdhMTMtM2M2NC1hYjFjLWZiNTllNTU0ZTY5My5wbmc

即:
1、容量 `capcaity` 总是不可进行修改的。
2、数据的读取或写入的会修改 `position` 的值,但是不会修改 `limit` 的值 并且 `position <= limit`
3、当写模式变成读模式时需要调用 `flip()`方法
4、`limit` 总是指向缓冲区中的第一个不可读取或写入元素的索引

发表评论

表情:
评论列表 (有 0 条评论,203人围观)

还没有评论,来说两句吧...

相关阅读

    相关 NIOBuffer

    Buffer 其实在Buffer中官方的javadoc中已经讲得非常清楚了,本篇博客是本人做为笔记使用。 下面是我截取的javadoc很详细的介绍了关于mark,po

    相关 NIOBuffer

    > Java NIO中的Buffer用于和NIO通道进行交互。数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内