概念上,缓冲区是包在一个对象内的基本数据元素数组,Buffer的底层就是一个数组, Buffer类相比一个简单数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中,Buffer类以及它专有的子类定义了一个用于处理数据缓冲区的API

    是NIO中非常重要的一个东西,实际上就是一个容器,是一个连续数组。在NIO中所有数据的读和写都离不开Buffer。在NIO中,读取的数据只能放在Buffer中。同样地,写入数据也是先写入到Buffer中。


    简单的讲就是,要想使用Channel(通道)传递数据,必须先把数据丢进Buffer(缓冲区,容器)里.

    你要写数据的时候,先写到buffer里面,再写往通道.你如果要读数据,也是先读到通道里面的buffer,然后再由应用程序来处理,这是必须要的


    在NIO中,Buffer是一个顶层父类,它是一个抽象类,常用的Buffer的子类有:
    ByteBuffer,IntBuffer,CharBuffer,LongBuffer,DoubleBuffer,FloatBuffer,ShortBuffer等
    用的最多的就是 ByteBuffer (字节流buffer.),其它的buffer和ByteBuffer是没有任何区别的.


    所以的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息:
    1. 容量(Capacity)
    缓冲区能够容纳的数据元素的最大数量,这一容量在缓冲区创建时被设定,并且永远不能被改变.假如容量设置为10,那就只能写10个,如果满了还想写怎么办,那就得清空.清空完了才能继续往里面去写.

    2. 上界(Limit)
    缓冲区的第一个不能被读或写的元素,或者说,缓冲区中现存元素的计数.

    Limit在写模式最大容量不能超过Capacity(容量),假如Capacity是10个字节,你给Limit写成11,这是错误的,现实是不允许的.


    3. 位置(Position)
    下一个要被读或者写的元素的索引,位置会自动由相应的get()和put()函数更新Position,一般不需要我们程序员去手动修改这个变量.


    4. 标记(Mark)
    一个备忘位置,调用mark()来设定mark=postion . 调用reset()设定position=mark,标记在设定前是未定义的(undefined)


    缓冲区的分类:
    1. 字节缓冲区 ByteBuffer
    2. 字符缓冲区 CharBuffer
    3. 双精浮点型(double)缓冲区 DoubleBuffer
    4. 单精浮点行(float)缓冲区 FloatBuffer
    5. 整型(int)缓冲区 IntBuffer
    6. 长整型(long)缓冲区 LongBuffer
    7. 短整型(long)缓冲区 ShortBuffer


    针对基本数据类型封装的缓冲区,可以说基本数据类型除了boolean类型的其它七种类型都有,


    上述的各类型的缓冲区,都提供了读和写的方法,get和put方法,也提供了一些批量的put和get方法,而且缓冲区可以通过allocation创建.此方法通过wrapping将一个现有(数据类型)数组包装到缓冲区中来为缓冲区内容分配空间.或者通过创建现有的字节缓冲区的视图来创建.



    要分配一个容量为100个char变量的缓冲区
    CharBuffer charBuffer = CharBuffer.allocate(100);