众所周知nio中buffer是核心的部分。看过视频也看过一些博客,我记录一下我的理解。
buffer是一块内存,可以是onheap也可以是堆外。里面有三个核心的概念
- position
- capacity
- limit
还有几个api操作如下
- clear
- compcat
- flip
如何理解buffer
- buffer是什么,来看源码注释
A buffer is a linear, finite sequence of elements of a specific primitive type.
- buffer内部其实就是数组。
- 让你来设计能过支持读和写的buffer如何设计?
- 想明白了之后再看看nio的buffer,😯原来就是个这啊,其实就是看你对数组的理解怎么样了
- 写一段java代码,打上断点,很容易观察到buffer怎么一回事儿。核心的三个概念很直观就能看到是多少。我这个代码演示的是
compact操作,了解了positioncapacitylimit的概念,然后通过debug学习。
关于读和写
有人说什么写模式什么读模式。我感觉这样更容易误导
- 首先从源码注释中没有看提到什么读模式转写模式,写模式转读模式一说
- 一个buffer capcity是10,你写到了5,然后get也没毛病呀,只是没拿到东西。其实是不符合需求的,我只写到了5,你就去拿6这样应该抛异常才对。
- 所以有了
flip操作。这个操作会position为0,limit变为刚才写到的地方。这样你读就只能读写过的内容,读超了抛异常。 - 读完了之后,由于
limit的限制,需要将limit=position才合理,所以有了clear操作。
总结
数据结构和算法是基本功,我相信你行😯