深入分析NIO原理及思想(二)——Java NIO Buffer简介

    前文提到了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主要是为了传输数据的时候有一个临时存放数据的地方,只要能满足:

  1.     存放数据
  2.     写入数据
  3.     读取数据
  4.     已经存放多少
  5.     已经读取多少
  6.     还能读取多少

    便能满足要求。而存放不同类型的数据,即不同Buffer的子类。

猜你喜欢

转载自blog.csdn.net/qq_37293230/article/details/80145614