概述:
在NIO中,数据的读写操作始终是与缓冲区相关联的。Channel将数据读入缓冲区,然后我们又从缓冲区访问数据。写数据时,首先将要发送的数据按顺序填入缓冲区。基本上,缓冲区只是一个列表,它的所有元素都是基本数据类型(通常为字节型)。缓冲区是定长的,它不像一些类那样可以扩展容量(例如,List,StringBuffer等)。注意,ByteBuffer是最常用的缓冲区,因为:1)它提供了读写其他数据类型的方法,2)信道的读写方法只接收ByteBuffer。总结来说就是Buffer就像一个数组
1、存储和接收数据
只要有了缓冲区,就可以用它来存放数据了。作为数据的"容器",缓冲区既可用来输入也可用来输出。这一点就与流不同,流只能向一个方向传递数据。使用put()方法可以将数据放入缓冲区,使用get()方法则可以从缓冲区获取数据。信道的read()方法隐式调用了给定缓冲区的put(),而其write()方法则隐式调用了缓冲区的get()方法。
这里不明白就是(read 对应的是put() write对应get())
相对位置:
byte get()
ByteBuffer get(byte[] dst)
ByteBuffer get(byte[] dst, int offset, int length)
ByteBuffer put(byte b)
ByteBuffer put(byte[] src)
ByteBuffer put(byte[] src, int offset, int length)
ByteBuffer put(ByteBuffer src)
绝对位置
byte get(int index)
ByteBuffer put (int index, byte b)
这里里面position类似一个指针,get/put都会往后移动,如果超过limit就会抛出异常
ByteOrder order() 字节的顺序
ByteBuffer order(ByteOrder order)
2.Buffer关键方法 clear() flip() 和rewind()以及compact()
clear()方法可以将position设置为0 limit设置等于capacity(容量)
flip()方法用来将缓冲区准备为数据传出状态,这通过将limit设置为position的当前值,再将 position的值设为0来实现
rewind()方法将position设置为0,并使mark值无效。这很像flip()方法的操作,只是limit的值没变
compact()方法将 position与limit之间的元素复制到缓冲区的开始位置,从而为后续的 put()/read()调用让出空间。复制数据是一个非常耗费系统资源的操作,因此要保守地使用compact()方法。
3.Buffer透视:duplicate() slice()
duplicate()方法用于创建一个与原始缓冲区共享内容的新缓冲区。新缓冲区的position,limit,mark和capacity都初始化为原始缓冲区的索引值,然而,它们的这些值是相互独立的。
slice()方法用于创建一个共享了原始缓冲区子序列的新缓冲区。新缓冲区的position值是0,而其limit和capacity的值都等于原始缓冲区的limit和position的差值。slice()方法将新缓冲区数组的offset值设置为原始缓冲区的position值,然而,在新缓冲区上调用array()方法还是会返回整个数组。
总结:没有例子总是那么枯燥。。。。。。。。