直接已知子类:
ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer
NIO中都是以缓冲区操作的。
缓冲区存在position 、limit、capacity 三个变量状态
缓冲区通过allocate来创建
属性 | 描述 |
---|---|
Capacit y | 容量,即可以容纳的最大数据量;在缓冲区创建时被设定并且不能改变 |
Limit | 表示缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的 |
Position | 位置,下一个要被读或写的元素的索引,每次读写缓冲区数据时都会改变改值,为下次读写作准备 |
Mark | 标记,调用mark()来设置mark=position,再调用reset()可以让position恢复到标记的位置 |
法 | 描述 |
---|---|
allocate(int capacity) | 从堆空间中分配一个容量大小为capacity的byte数组作为缓冲区的byte数据存储器 |
allocateDirect(int capacity) | 是不使用JVM堆栈而是通过操作系统来创建内存块用作缓冲区,它与当前操作系统能够更好的耦合,因此能进一步提高I/O操作速度。但是分配直接缓冲区的系统开销很大,因此只有在缓冲区较大并长期存在,或者需要经常重用时,才使用这种缓冲区 |
wrap(byte[] array) | 这个缓冲区的数据会存放在byte数组中,bytes数组或buff缓冲区任何一方中数据的改动都会影响另一方。其实ByteBuffer底层本来就有一个bytes数组负责来保存buffer缓冲区中的数据,通过allocate方法系统会帮你构造一个byte数组 |
wrap(byte[] array, int offset, int length) | 在上一个方法的基础上可以指定偏移量和长度,这个offset也就是包装后byteBuffer的position,而length呢就是limit-positi |
ByteBuffer buf = ByteBuffer.allocateDirect(10) ; // 准备出10个大小的缓冲区
System.out.print("1、写入数据之前的position、limit和capacity:") ;
System.out.println("position = " + buf.position() + ",limit = " + buf.limit() + ",capacty = " + buf.capacity()) ;
byte temp[] = { 1, 2, 3, 4, 5 }; // 设置内容
buf.put(temp);// 设置一组内容
System.out.print("2、写入数据之后的position、limit和capacity:") ;
System.out.println("position = " + buf.position() + ",limit = " + buf.limit() + ",capacty = " + buf.capacity()) ;
buf.flip(); //重设缓冲区
System.out.print("3、准备输出数据时的position、limit和capacity:") ;
System.out.println("position = " + buf.position() + ",limit = " + buf.limit() + ",capacty = " + buf.capacity()) ;
System.out.print("主缓冲区中的内容:") ;
while (buf.hasRemaining()) {
System.out.print(buf.get()+"、");
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IntBuffer buf = IntBuffer.allocate(10) ; // 准备出10个大小的缓冲区
IntBuffer sub = null ; // 定义子缓冲区
for(int i=0;i<10;i++){
buf.put(2 * i + 1) ; // 在主缓冲区中加入10个奇数
}
// 需要通过slice() 创建子缓冲区
buf.position(2) ;
buf.limit(6) ;
sub = buf.slice() ;
for(int i=0;i<sub.capacity();i++){
int temp = sub.get(i) ;
sub.put(temp-1) ;
}
buf.flip() ; // 重设缓冲区
buf.limit(buf.capacity()) ; //返回此缓冲区的容量。
System.out.print("主缓冲区中的内容:") ;
while(buf.hasRemaining()){
int x = buf.get() ;
System.out.print(x + "、") ;
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------