java NIO 缓冲区

    xiaoxiao2021-03-25  60

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

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

    转载请注明原文地址: https://ju.6miu.com/read-50315.html

    最新回复(0)