缓冲区是包在一个对象内的基本数据元素数组,Buffer类相比于一个简单数组的优点是塔将关于数据的数据内容和数据信息包含在一个单一的对象中。Buffer类以及其专有子类定义了一个用于处理数据缓冲区的API。所有缓冲区有四个属性;
容量,上界,位置,标记
上界;缓冲区第一个不能被读或者写的的元素。或者是缓冲去现存元素的计数。
位置:下一个被读或者写的元素的索引+位置会自动的由相应get()或者put()更新。
缓冲区的创建;新的缓冲区是通过分配或者包装操作创建。分配操作创建一个缓冲区对象并分配一个私有空间来存储容量大小的数据元素。包装操作创建一个缓冲区对象但是不分配任何空间来存储数据元素,他使用自己所提供的数组作为存储空间来存储缓冲区的数据元素。
要分配一个容量100的char变量charBuffer;
CharBuffer charbuffer =CharBuffer.allocate(100);
包装操作:
Char [] myARRAY =NEW CHAR[100];
CharBuffer charbuffer = CharBuffer.wrap(myArray);
通过allocat()和wrap()创建缓冲区都是间接的。间接的缓冲区使用备份数组,可以通过API函数来取得这些数组的存取权,Boolean型的函数hasArray()告诉我们这个缓冲区是否有一个可存取的备份数组,如果返回true,则返回该备份数组的一个引用。
案例:
package it.com.Jerome;
import java.nio.IntBuffer;
public class BufferTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建制定长度的缓冲区
IntBuffer buff = IntBuffer.allocate(10);
int [] array =new int[]{3,5,7};
//使用数组来创建缓冲区视图
buff = buff.wrap(array);
//使用数组中的一部分来创建缓冲区视图
//buff = buff.wrap(array,0,2);
buff.put(0,7);
System.out.println("输出缓冲区数据如下:");
for(int i=0;i<buff.limit();i++){
System.out.print(buff.get()+"\t");
//调用get方法 pos自动下移
}
System.out.println("\n输出原始数据:");
for(int a:array){
System.out.print(a+"\t");
}//对缓冲区数据的修改也会影响到原始数组中的数据
buff.flip();//对缓冲区进行反转,(缓冲区指针回到初始位置,limit=pos,pos=0)
buff.clear();//位置清零和flip一样。
System.out.println("输出缓冲区数据如下:");
for(int i=0;i<buff.limit();i++){
System.out.print(buff.get(i)+"\t");
}
System.out.println("\n");
IntBuffer buff2=buff.duplicate();
System.out.println(buff2);
for(int i=0;i<buff2.limit();i++){
System.out.print(buff2.get(i)+"\t");
}
}
}