这里通过clone和compact方法来完成。 Buffer.clear() 当调用clear()方法的时,position将被设回0,limit被设置成capacity的值,Buffer被清空。 如果Buffer中有一些未读的数据,调用clear()方法,数据将被覆盖。 Buffer.compact() compact()会将所有未读的数据拷贝
clear() VS compact()clear只是对position、limit、mark进行重置,而compact在对position进行设置,以及limit、mark进行重置的同时,还涉及到数据在内存中拷贝。所以compact比clear更耗性能。但compact能保存你未读取的数据,将新数据追加到为读取的数据之后;而clear则不行,若你调用了clear,则未读取的数据就无法再读取到了。
然后将limit 设置成 最后一次 position 的位置,这样做在复杂,因此提供了一个 compact 操作,我们在 write 后,执行 buffer.compact()将没有发出的数据复制到 buffer 的开始位置,posittion = limit-position,limit = capacity,这样在下一次read(buffer)的时候,数据就会继续添加到缓冲的后面了 ;因此标准的从一个channel...
从Buffer中读取数据 调用clear()方法或者compact()方法 flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数据。 clear()方法会清空整个缓冲区。 compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。 一个挺...
compact():将position与limit之间的内容移到0与(limit - position)之间的区域,position的值变为limit - position,limit的值变为capacity;如果先将position的设置到limit,再执行compact操作,就相当于clear操作(注意:compact表示压缩数据,例如当前EOF是6,当前指针指向2即下标0、1位置的数据已经写出,此时执行compact方法就...
compact(): 将未读数据复制到缓冲区的头部。 mark(): reset():mark 可以标记一个位置,reset 可以重置到那个位置。 缓冲区常见类型: ByteBuffer 、 MappedByteBuffer 、 CharBuffer 、 DoubleBuffer 、 FloatBuffer 、 IntBuffer 、 LongBuffer 、 ShortBuffer 。
buffer.compact(); 压缩后的结果如下图 图6 duplicate() 方法 duplicate() 方法创建了一个与原始缓冲区一样的新缓冲区。两个缓冲区共享数据,拥有同样的 capacity ,但每个缓冲区都拥有自己的 position,limit 和 mark 属性。对一个缓冲区内的数据元素所做的改变会反映在另外一个缓冲区上。这一副本缓冲区具有与原...
compact()方法将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样,设置成capacity。现在Buffer准备好写数据了,但是不会覆盖未读的数据。 mark()与reset()方法 通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset...
compact()方法将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样,设置成capacity。现在Buffer准备好写数据了,但是不会覆盖未读的数据。 mark()与reset()方法 通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset...
1、向buffer写入数据,例如调用channel.read(buffer),该方法表示从channel中读取数据并写入到buffer中。(注意:此时我们要站在buffer的角度) 2、调用flip( )从写模式切换至读模式 3、从buffer读取数据,例如调用buffer.get( )。 4、调用clear( )方法或者compact( )方法。