缓冲区是包在一个对象内的基本数据元素数组,Buffer类相比一个简单的数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中。
Buffer的属性
容量(capacity):缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能被改变
上界(limit):缓冲区的第一个不能被读或写的元素。或者说,缓冲区中现存元素的计数
位置(position):下一个要被读或写的元素的索引。位置会自动由相应的 get( )和 put( )函数更新
标记(mark):下一个要被读或写的元素的索引。位置会自动由相应的 get( )和 put( )函数更新一个备忘位置。调用 mark( )来设定 mark = postion。调用 reset( )设定 position =mark。标记在设定前是未定义的(undefined)。这四个属性之间总是遵循以下关系:0 <= mark <= position <= limit <= capacity
例如:
// mark=position=0;limit=capacity=256
ByteBuffer buf = ByteBuffer.allocate(256);
Buffer源码分析
package com.swk.nio;
import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
import java.nio.InvalidMarkException;
import java.nio.ReadOnlyBufferException;
public abstract class Buffer {
// Invariants: mark <= position <= limit <= capacity
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;
// Used only by direct buffers
// NOTE: hoisted here for speed in JNI GetDirectBufferAddress
long address;
// Creates a new buffer with the given mark, position, limit, and capacity,
// after checking invariants.
//根据mark,position,limit,capacity初始化buffer
Buffer(int mark, int pos, int lim, int cap) { // package-private
if (cap < 0)
throw new IllegalArgumentException("Negative capacity: " + cap);
this.capacity = cap;
limit(lim);
position(pos);
if (mark >= 0) {
if (mark > pos)
throw new IllegalArgumentException("mark > position: ("
+ mark + " > " + pos + ")");
this.mark = mark;
}
}
/**
* 返回Buffer的容量
* @author fuyuwei
* 2017年6月19日 下午9:23:19
* @return
*/
public final int capacity() {
return capacity;
}
/**
* 返回Buffer的位置
* @author fuyuwei
* 2017年6月19日 下午9:23:33
* @return
*/
public final int position() {
return position;
}
/**
* 设置Buffer的position,如果mark>position,则mark废弃
* @author fuyuwei
* 2017年6月19日 下午9:23:56
* @param newPosition
* @return
*/
public final Buffer position(int newPosition) {
if ((newPosition > limit) || (newPosition < 0))
throw new IllegalArgumentException();
position = newPosition;
if (mark > position) mark = -1;
return this;
}
/**
* 返回Buffer的上界
* @author fuyuwei
* 2017年6月19日 下午9:25:10
* @return
*/
public final int limit() {
return limit;
}
/**
* 设置Buffer的上界,如果position>limit,则把position设置为新的limit,如果mark>newLimit则废弃mark
* @author fuyuwei
* 2017年6月19日 下午9:25:26
* @param newLimit
* @return
*/
public final Buffer limit(int newLimit) {
if ((newLimit > capacity) || (newLimit < 0))
throw