Buffer本质上就是一块可以重复进行读写的内存空间,为了理解它是如何使用内存来进行读写,需要理解如下的三个概念:

    • capacity:容量,缓冲区的总长度,如果缓冲区已满还需要写入数据,就需要先清空再写入
    • position:位置,下一个要操作的数据元素的位置。起始位置为0,随着数据的写入不断的后移,最大为capacity - 1。当从buffer中读取数据时,position重置回0,记录下一个要读取数据的位置
    • limit:缓冲区中不可操作的下一个元素的位置,用于限制程序可以写入或者读取的数据量,通常为limit <=capacity

      读取的数据量不能超过写入的数据量。

    Buffer有两种模式,写模式和读模式。在写模式下调用flip()之后,Buffer从写模式变成读模式。如果想要从写模式转换到读模式,则可以调用clear方法或是compact方法。
    image.png
    flip方法的源码如下:

    1. public final Buffer flip() {
    2. limit = position;
    3. position = 0;
    4. mark = -1;
    5. return this;
    6. }

    flip方法主要做了如下三步:

    • 设置limit值为最后的position值
    • 将position值置为0
    • 清除mark标记

    假设Buffer的容量大小为8,初始时Buffer示意图如下所示:
    image.png

    然后往Buffer中写入5个数据,变成如下的情况:
    image.png

    调用flip方法后,position、limit和capacity的变化如下所示:
    image.png

    此时position指到Buffer头部,并且limit移动到之前position的位置,表示最多只能读出之前写入的数据长度(而不是整个缓存的容量大小)。这样在执行读操作时,从头读取,并且最多只能读取之前写入的数据量。

    最后,通过程序验证下上述的流程,如下所示:

    1. /**
    2. * @Author dyliang
    3. * @Date 2020/10/25 9:17
    4. * @Version 1.0
    5. */
    6. public class BufferTest {
    7. private static final int BUFFER = 8;
    8. public static void main(String[] args){
    9. IntBuffer buffer = IntBuffer.allocate(BUFFER);
    10. System.out.println("-------------before--------------");
    11. System.out.println("position is: " + buffer.position());
    12. System.out.println("limit is: " + buffer.limit());
    13. System.out.println("capacity is: " + buffer.capacity());
    14. for (int i = 0; i < 5; i++) {
    15. buffer.put(i);
    16. }
    17. buffer.flip();
    18. System.out.println("-------------after--------------");
    19. System.out.println("position is: " + buffer.position());
    20. System.out.println("limit is: " + buffer.limit());
    21. System.out.println("capacity is: " + buffer.capacity());
    22. System.out.println("--------------------------------");
    23. while(buffer.hasRemaining()){
    24. System.out.println(buffer.get());
    25. }
    26. }
    27. }

    程序输出:

    1. -------------before--------------
    2. position is: 0
    3. limit is: 8
    4. capacity is: 8
    5. -------------after--------------
    6. position is: 0
    7. limit is: 5
    8. capacity is: 8
    9. --------------------------------
    10. 0
    11. 1
    12. 2
    13. 3
    14. 4