Buffer的原理及应用

缓冲区的概念

数据在缓冲区中排队,你先入先出的形式读写。先写入的数据先被读出来。所以看上去缓冲区像一个水管,数据流入缓冲区,然后再流出。

image-20210207111212852

缓冲区内部是用于存储数据的数据结构。可能是数组、可能是链表、甚至可能是复杂的树结构,比如哈希表、树等等都有可能。

比如一个聊天服务,在处理用户发送的消息时,例如微信,一定不能马上处理这条消息。而是应该先缓冲。如果你马上处理这些消息,当并发量高的时候,总有你处理不过来的时候。而你对消息进行了缓冲有很多的好处,首先是避免了瓶颈的出现(运算性能的瓶颈。Io性能的瓶颈)。其次,有时候批量处理数据的成本更低。比如批量写入磁盘。批量发送网络请求。可以更好的利用底层的设施,比如批量写入磁盘数据就比单个一点点写入快很多很多,这些都是缓冲区的价值。

缓冲区操作

  • flip() 翻转:读写切换
  • clear() :清空缓冲区
  • rewind() :重读或重写

flip操作

读取这样的缓冲区就需要进行缓冲区的翻转,也就是flip操作。

image-20210207214536307

上图中的flip操作,将position设置为0,limit设置为position的位置。这样就从一个写入缓冲区,切换到了读取缓冲区。接下来,我们就通过指针P就可以读取缓冲区的内容,而limit左边的就是有数据的。

所以flip操作的作用是帮助缓冲区在读写之间切换。

通过这个例子,你会发现,limit才缓冲区的实际数据范围,Capacity是一个物理限制。

clear操作

当缓冲区使用完可以进行清空。清空操作将缓冲区恢复到初始状态。也就是position=0,Limit=Capacity的状态。这个操作称之为clear操作,如下图所示。

image-20210207215503270

rewind操作

另外,有时候我们需要重新读取流中的数据。这个时候,就像倒带(rewind)一样,需要将position置0,其他不变。

image-20210207215629298

[ ](https://book.weavinghorse.com/smile-java/docs/2-5 buffer/#实战举例)