用来定义缓冲区的所有类都以Buffer类为基类,Buffer定义了缓冲区的基本特征。
直接子类:
ByteBuffer 用来存储byte类型的缓冲区,可以在这种缓冲区中存储任意其他基本类型的二进制值(boolean 除外)。存储的每个二进制值在缓冲区中占据的字节长度根据类型的长度决定,char和short占2个字节,int占4个字节
CharBuffer 只存储char类型的值的缓冲区
DoubleBuffer只存储double类型的值的缓冲区
FloatBuffer只存储float类型的值的缓冲区
IntBuffer只存储int类型的值的缓冲区
LongBuffer只存储long类型的值的缓冲区
ShortBuffer只存储short类型的值的缓冲区
小结:没有boolean类型的缓冲区,boolean可以用int代替。
1、缓冲区容量
缓冲区容量是指缓冲区所能包含的值的最大数目而不是字节数目(除非存储byte类型的元素,byte占一个字节)。缓冲区的容量一旦创建不能改变。通过调用capacity()方法返回缓冲区容量。
2、缓冲区的limit和position
3、创建缓冲区
缓冲区类没有公共的构造函数,可以用静态工厂的方法创建。可以调用静态方法allocate()方法创建ByteBuffer缓冲区对象。
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
IntBuffer intBuffer = IntBuffer.allocate(100);
第一行创建一个容量为1024,position为0。
第二行创建了一个容量为100,limit为100,占据了400个字节的(因为每个int4个字节),position为0的缓冲区。
实践得知除了ByteBuffer之外的缓冲区无法进行IO操作。通常创建ByteBuffer,在通过ByteBuffer创建其他的缓冲区。
a、创建视图缓冲区
可以用ByteBuffer对象创建其他类型的缓冲区,新缓冲区共享原始ByteBuffer的全部或者部分内存,这样的缓冲区被叫做视图缓冲区。
视图缓冲区有两种用途:
在非byte类型的数据项被写入到文件中之前把他们加载到ByteBuffer中。
在从文件中读取的数据作为非byte类型的数据的值进行访问。
创建IntBuffer类型的视图缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
IntBuffer intBuffer= byteBuffer.asIntBuffer();
intBuffer的最大容量为1024/4 (int为4个字节),position为0。
b、复制和切分缓冲区
调用duplicate()方法复制缓冲区,这个方法返回和原始缓冲区一样类型的缓冲区,并且共享原始缓冲区的内存,但是容量和limit是单独分开的。
调用slice()切分缓冲区,生成的缓冲区被映射到原始缓冲区的一部分,从location到limit-1。同样内存共享,但是容量和limit是单独分开的。
c、通过封装数组来创建缓冲区
通过warp()方法来创建缓冲区。
String string = "young ken 的技术博客";byte[] bytes =string.getBytes();
ByteBuffer byteBuffer= ByteBuffer.wrap(bytes);
这里的bytes和缓冲区用的是一块内存,如果修改缓冲区的数据数组的数据也发生变化。
4、标记缓冲区
通过mark()方法进行标记,如对缓冲区进行和一系列设置如
ByteBuffer byteBuffer = ByteBuffer.allocate(100);
byteBuffer.limit(50);
byteBuffer.position(2);
byteBuffer.mark();
现在对缓冲区进行了标记,标记的状态为limit50,position2。我现在要设置position为5,操作完之后调用reset(),缓冲区将重新变成limit50,position2。
原文:http://www.cnblogs.com/youngKen/p/4923635.html