详细了解JAVA NIO之Buffer(缓冲区)

2020-07-01 18:00 来源:易采站长站 作者:王旭 点击: 评论:

A-A+

原标题:详细了解JAVA NIO之Buffer(缓冲区)

当我们需要与 NIO Channel 进行交互时, 我们就需要使用到 NIO Buffer, 即数据从 Buffer读取到 Channel 中, 并且从 Channel 中写入到 Buffer 中。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。

缓冲区基础

Buffer 类型有:

缓冲区是包在一个对象内的基础数据的数组,Buffer类相比一般简单数组而言其优点是将数据的内容和相关信息放在一个对象里面,这个对象提供了处理缓冲区数据的丰富的API。

所有缓冲区都有4个属性:capacity、limit、position、mark,并遵循:capacity>=limit>=position>=mark>=0,下面是对这4个属性的解释:

Capacity:     容量,即可以容纳的最大数据量;在缓冲区创建时被设定并且不能改变 Limit:           上界,缓冲区中当前数据量 Position:      位置,下一个要被读或写的元素的索引 Mark:           标记,调用mark()来设置mark=position,再调用reset()可以让position恢复到标记的位置即position=mark

我们通过一个简单的操作流程来说明buffer的使用,下图是新创建的容量为10的缓冲区逻辑视图:

然后进行5次调用put:

buffer.put((byte)'A').put((byte)'B').put((byte)'C').put((byte)'D').put((byte)'E')

5次调用put之后的缓冲区为:

现在缓冲区满了,我们必须将其清空。我们想把这个缓冲区传递给一个通道,以使内容能被全部写出,但现在执行get()无疑会取出未定义的数据。我们必须将 posistion设为0,然后通道就会从正确的位置开始读了,但读到哪算读完了呢?这正是limit引入的原因,它指明缓冲区有效内容的未端。这个操作 在缓冲区中叫做翻转:buffer.flip()。

Buffer的基本用法

使用Buffer读写数据一般遵循以下四个步骤:

写入数据到Buffer 调用flip()方法 从Buffer中读取数据 调用clear()方法或者compact()方法

当向buffer写入数据时,buffer会记录下写了多少数据。

一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数据。

一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。有两种方式能清空缓冲区:调用clear()或compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。

【易采站长站编辑:秋军】