前文提到了NIO产生的原因,NIO的三个核心,Buffer,Channel,以及Selector。
今天就来讨论一下Buffer,没有什么比自己写一个Buffer更能体会到它的精髓所在了,有兴趣的可以参考源码自己实现一个,本文再这里提供一些参考。
这是整理出来的有关于java.nio几个类的uml图,有心可以看出,基本全是抽象类,也就是说,他们的实现类,都是非public的,不希望我们去调用的。
什么是Buffer?java api文档中这么解释:一个用于特定基本类型数据的容器。
这样的解释无疑可以让我们联想到另一个包中的一组类。也就是容器类,无论是组织方法,又或者是功能,都有其相似之处。
首先,Buffer又或是Collection都是存放东西的容器,前者叫缓冲区,后者叫集合/容器。通俗来讲就是内存里面的一个区域,放一些东西,Collection关注以什么形式存放,比如list,set或者queue等,放的数据的类型,由泛型指定,可以为任意类型。而Buffer关注的是存放什么类型的数据,只支持基础类型,而且不支持基础类型的boolean类型。所以基础的Buffer,就是7种,对应Java的7个基础类型。
byte | ByteBuffer |
short | ShortBuffer |
int | IntBuffer |
long | LongBuffer |
float | FloatBuffer |
double | DoubleBuffer |
char | CharBuffer |
MappedByteBuffer较为特殊,暂且不说。
我们对比下buffer和collection。从组织结构和功能去讨论。
collection以接口形式组织,Buffer以抽象类形式组织。
collection中,以List为例子主要的是为了获得一个可以动态变化大小的容器,来存放指定的类型数据。
而buffer主要是为了传输数据的时候有一个临时存放数据的地方,只要能满足:
- 存放数据
- 写入数据
- 读取数据
- 已经存放多少
- 已经读取多少
- 还能读取多少
便能满足要求。而存放不同类型的数据,即不同Buffer的子类。