【Java】NIO中的Buffer、limit、position、capacity的含义以及常用方法

通过本文可以获得如下知识:
① 图解NIO Buffer中的capacity、position、limit的含义。
② 一个Java demo程序演示三者的变化关系。
③ Buffer常用方法。

我们知道Java NIO 由以下三个核心部分组成:

  • Channel(通道)
  • Buffer(缓冲区)
  • Selector(选择器)

在编写NIO程序时,我们对数据的实际操作都是通过Buffer来进行的,经常会用到java.nio.Buffer中的flip()方法。

本文会通过NIO程序实例来讲解flip方法以及limit、position、capacity三个成员变量。

一、Buffer

我们使用 Buffer 与 Channel 交互,数据从Channel读入Buffer,或从Buffer写入到Channel中。

缓冲区的本质是一个可以写入数据的内存区域,之后可以读取数据。 Buffer 对象包装了此内存区域,并提供了一组方法,可以更轻松地使用内存块。

1.1 Buffer的几个重要成员变量

  • capacity : 指定了可以存储在缓冲区中的最大数据容量,实际上,它指定了底层数组的大小,或者至少是指定了准许我们使用的底层数组的容量。不能为负并且不能更改。

  • limit : 指定还有多少数据需要取出(在从缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)。缓冲区的limit永远不为负,也永远不大于其capacity。

  • position :指定了下一个将要被写入或者读取的元素索引,它的值由get()/put()方法自动更新,在新创建一个Buffer对象时,position被初始化为0。不能为负,并且不能大于 limit。

以上三个属性值之间有一个相对大小的关系:0 <= position <= limit <= capacity。

下面我们用一个图例来解释一下这三个属性的关系及变化过程。

假设我们创建了一个容量为10的ByteBuffer对象,在初始化时,position会被设置为0,limit和capacity被设置为10。在之后使用ByteBuffer对象过程中,capacity的值不会再发生变化,而其它两个值会随着使用而变化。初始时三个属性的值如下图所示:

还有 78% 的精彩内容
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
支付 ¥1.00 继续阅读