Buffer

来源:互联网 发布:淘宝扶植版免费模板 编辑:程序博客网 时间:2024/06/10 01:56

Buffer——缓冲区
所谓的缓冲区其实就是内存中一段连续的空间,可以向其中写入/读取数据,从而实现数据的保持、共享和处理
Buffer分类:(7)
ByteBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
CharBuffer
1.如何创建缓冲区对象
allocate(int capacity);//创建出指定大小的缓冲区,单位取决于创建出的缓冲区的类型
wrap(byte [] buf)//将byte数组包装到缓冲区中
wrap(byte [] buf, int offset, int length)//将byte数组包装到缓冲区中
---buf 支持新缓冲区的数组
---offset 子数组的偏移量
---length 子数组的长度,新缓冲区的界限=offset+length
2.如何向缓冲区中写入数据
put(byte b)
put(byte [] bs)
put(byte [] bs, i, len)
put(ByteBuffer buf)
channel.read(buf)//从通道中获取数据填写到buf中
3.如何从缓冲区
get() //从缓冲区中获取一个单位的数据
get(byte [] bs)//从缓冲区中获取数据填入到数组中数组有多大就获取多少数据往里写
get(byte [] bs, int offset, int length)//从缓冲区获取数据填入数组中,从数组指定位置开始填入指定数量
get(int index)//获取指定位置上的数据
channel.write(ByteBuffer buf)//将缓冲区中的数据写入到通道中
4.缓冲区中的属性
capacity - 容量
position - 当前位置
limit - 限制位置

缓冲区在刚创建出来时capacity等于缓冲区大小,position为0,limit等于capacity。
在向缓冲区写入数据时,会在position指向的位置写入数据,写入后position+1指向下一个写入位置。
在从缓冲区中读取数据时,从position指向的位置读取数据,position+1指向下一个读取的位置。由此可知position的最大值为capacity-1。
limit指定限制位置,在写入数据时,position的值不能超过limit,通过limit可以指定最多写到哪个位置。
在从缓冲区中读取数据时,limit可以限制position最大的位置,从而限制最多读取到哪里。
int capacity()
返回此缓冲区的容量
int position()
返回此缓冲区的位置
Buffer position(int new Position)
设置此缓冲区的位置
int limit()
返回此缓冲区的限制
Buffer limit(int newLimit)
设置此缓冲区的限制
5.其他方法
flip(); //反转缓冲区,一般用在向缓冲区中写入完数据后试图从中读取数据之前调用,将limit设置到当前position位置,将position归零
hasRemaining();//通常在循环读取时,判断position和limit之间有没有元素,从而控制循环的边界。
clear(); //通常在读取完成后清空缓冲区准备重复使用时。limit被设置为和capacity相同,position设置为0,但是注意数据并不是真的清空,而是知道再往里写入数据时覆盖旧的数据。
compact(); //压缩此缓冲区。此方法用来将已经读取的数据干掉,将未读的数据挪到缓冲区的最开始位置,再向其中写数据时追加到已有数据后面。此方法将所有未读取的数据拷贝到Buffer起始处,然后将position设置到最后一个未读取元素后面。limit设置为和capacity一致。
rewind(); //重绕此缓冲区。再读取时position值为0,重新进行读取。
mark(); //当前position位置上设置一个标记,可以在后续需要时跳转回到这个标记位
reset(); //回到之前的标记位操作
array(); //返回缓冲区底层的数组(预先调用hasArray方法判断)
6.分散和聚合
分散:所谓的分散其实就是从一个通道中获取数据依次写入到多个缓冲区中的过程。
ByteBuffer bufs [] = {buf1, buf2, buf3};
channel.read(bufs);
聚合:将多个缓冲区中的数据依次写出到一个管道中去
ByteBuffer bufs [] = {buf1, buf2, buf3};
channel.read(bufs);
Charset
Charset forName(String cname)
编码:
ByteBuffer encode(CharBuffer)
ByteBuffer encode(String)
解码:
CharBuffer decode(ByteBuffer)
Channel -- 通道
代表数据传输的通道
即可以读取数据也可以写出数据
读写操作都可以是异步进行的
通道总是将数据写入到一个Buffer或者从Buffer中向通道写入数据
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
传统的Socket/ServerSocket编程中可能产生阻塞的地方在于 accept connet read write
NIO中的SocketChannel/ServerSocketChannel可以以非阻塞的方式实现TCP通信

Selector -- 选择器
Selector叫做选择器,可以在它身上注册多个非阻塞的通道,通过Selector来统一管理这些通道,选择已经就绪可以处理的通道来处理,从而只需要很少的线程就可以管理多个通道了。特别适合于开启了很多个通道但是每个通道中数据流量都很少的情况。可以大大的减少线程的数量和减少内存消耗避免cpu无意义的轮询。

select();//次方发阻塞,等待有就绪的通道再进行处理


0 0