初识NIO(二)——Buffer的基本使用

144 阅读2分钟

这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

前言

大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要带大家了解Buffer的常用方法。

Buffer的常用方法

    • intcapacity() 返回缓冲区的容量大小。
      Bufferclear() 为下次装入数据做好准备,将position设置为0,limit设置为capacity
      Bufferflip() 为取出数据做好准备,将limit设置为position,将position设置为0
      booleanhasRemaining() 判断position和limit之间是否存在元素。
      abstract booleanisDirect() 判断缓冲区是否为 direct 。
      abstract booleanisReadOnly() 判断缓冲区是否是只读的。
      intlimit() 返回此缓冲区的limit位置。
      Bufferlimit(int newLimit) 重新设置limit的值
      Buffermark() 设置缓冲区的标记。
      intposition() 返回此缓冲区的position位置。
      Bufferposition(int newPosition) 重新设置position的值
      intremaining() 返回当前位置和limit之间的元素个数。
      Bufferreset() 将此缓冲区的position设置为先前mark的位置。
      Bufferrewind() 将position设置为0,并取消设置的mark

以上方法我们应该重点关注flip()方法和clear()方法,在我们进行数据读取时会使用。

对于Buffer的子类,还提供了两个用于存取数据的方法:put()和get()。

使用put()和get()进行数据操作时分为两种方式:相对和绝对。

相对就是不指定索引,在position位置开始读写数据,position位置会改变。绝对就是指定具体索引位置进行数据的读写,不改变position的位置。

我们通过一个具体的实例学习:

public class Test {
    public static void main(String[] args) {
        CharBuffer buffer = CharBuffer.allocate(10);
        System.out.println("初始时position的位置:"+buffer.position());
        System.out.println("初始时limit的位置:"+buffer.limit());
​
        buffer.put('1');
        putShow(1,buffer);
        buffer.put('2');
        putShow(2,buffer);
        buffer.put('3');
        putShow(3,buffer);
​
        buffer.flip();
        flipShow(buffer);
​
        char a = buffer.get();
        getShow(1,buffer,a);
        char b = buffer.get();
        getShow(2,buffer,b);
        char c = buffer.get();
        getShow(3,buffer,c);
​
        buffer.clear();
        clearShow(buffer);
​
        char a1 = buffer.get(0);
        getIndexShow(1,buffer,a1);
        char a2 = buffer.get(0);
        getIndexShow(2,buffer,a2);
        char a3 = buffer.get(0);
        getIndexShow(3,buffer,a3);
​
​
    }
    private static void putShow(int i, Buffer buffer){
        System.out.println("加入第"+i+"个元素后position的位置:"+buffer.position()+",limit的位置:"+buffer.limit());
    }
    private static void getShow(int i, Buffer buffer,char c){
        System.out.println("获取第"+i+"个元素"+c+"后position的位置:"+buffer.position()+",limit的位置:"+buffer.limit());
    }
    private static void flipShow(Buffer buffer){
        System.out.println("调用flip方法后position的位置:"+buffer.position()+",limit的位置:"+buffer.limit());
    }
    private static void clearShow(Buffer buffer){
        System.out.println("调用clear方法后position的位置:"+buffer.position()+",limit的位置:"+buffer.limit());
    }
    private static void getIndexShow(int i, Buffer buffer,char c){
        System.out.println("使用索引获取第"+i+"个元素"+c+"后position的位置:"+buffer.position()+",limit的位置:"+buffer.limit());
    }
}

image.png

图示过程如下:

image.png

image.png

image.png

image.png

image.png