Buffer简介
Buffer意为缓冲区,其本质上就是是一块可写入数据,然后可以从中读取数据的内存区域,通过该种方式有助于减少系统开销和提高外设效率。对于缓冲区我们早有所了解,比如在C中标准I/O中的read,write直接调用系统的输入输出,而scanf和printf则借助缓冲区在适当的时候调用read,write操作。在NIO中,为了方便对缓冲区的操作,jAVA设计者将缓冲区封装为Buffer(实际上就是封装了基本数据元素的数组),并提供相应的方法对其操作。
在开始之前,首先需要明白以下几个概念:
- 读模式和写模式
- Buffer的capacity
- Buffer的position
- Buffer的limit
读模式和写模式
对于一块内存区而言,将数据写入该区域的过程称之为写模式。反之,称之为读模式。
capacity
该内存的大小即数组的的容量称为Buffer的capacity。一旦Buffer满了,你需要将其清空才能继续写入数据。
position
Buffer当前游标的位置称为position。在写模式下position表示当前的位置。初始的position值为0.当一个byte、long等数据写到Buffer后,position会向前移动到下一个可插入数据的Buffer单元。position最大可为capacity – 1。当将Buffer从写模式切换到读模式,position会先被重置为0,然后当从Buffer的position处读取数据时,position向前移动到下一个可读的位置。
limit
在写模式下,Buffer的limit表示你最多能往Buffer里写多少数据。写模式下,limit等于Buffer的capacity。当切换Buffer到读模式时,limit表示你最多能读到多少数据。因此,当切换Buffer到读模式时,limit会被设置成写模式下的position值。换句话说,你能读到之前写入的所有数据(limit被设置成已写数据的数量,这个值在写模式下就是position)
我们用一张图来大体的概括:
Buffer使用
Buffer的使用过程大体遵循以下步骤:
分配缓存大小——>写数据到Buffer——>调用其filp()——>从Buffer读取数据——>调用clear()或者compact()。
当向buffer写入数据时,buffer会记录下写了多少数据。一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数据。一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。
1. 创建Buffer
通过allocate()或者通过wrap()方法