java NIO 缓冲区

Buffer
直接已知子类:

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;iint 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 + "、") ;
}



--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------







你可能感兴趣的:(java,nio)