Buffer用于和channel进行交互,数据是从channel读入buffer,从buffer写入到channel中的。buffer本质上是一块可以写入数据,然后可以从中读取数据的内存。Buffer的读写示例请移步 java nio(二)FileChannel
Buffer的主要类型
- ByteBuffer
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
- MappedByteBuffer
Buffer的3个重要属性
capacity
指buffer的容量,当buffer满了,需要将其清空才能继续写数据往里写数据。
position
position初始值为0。当向buffer写入数据后, position会向前移动到下一个可插入数据的单元。position最大值为capacity – 1。
当从写数据切换到读取数据时,调用flip方法会将position重置为0。每次读取数据时,position会向前移动到下一个可读的位置。
limit
- 在向buffer 写入数据时,limit表示最多能往buffer里写多少数据,等于capacity的值。
- 从buffer读取数据时,limit表示最多能读到多少数据(即buffer写入的所有数据)。等于写数据时的position的值。
Buffer的几个重要方法
flip()方法
将position的值设为0,并将limit的值设置为之前position的值。
rewind()方法
将position的值设为0,limit保持不变。可以通过该方法重读buffer中的所有数据。
mark()与reset()方法
mark()方法可以标记buffer中的一个特定position,通过调用reset()方法可以恢复到这个position。如果我们需要多次调用buffer.get()方法来获取同一position的值,可以先用mark方法进行标记,之后再通过reset方法解除。
clear()与compact()方法
调用clear()方法,position值将被设为0,limit则被设置为 capacity的值,但buffer中的数据并未清除。
compact()方法将所有未读的数据复制到buffer起始处,然后将position的值设到最后一个未读元素后面,limit设置为capacity。