美文网首页
java NIO Buffer

java NIO Buffer

作者: 陆阳226 | 来源:发表于2020-06-08 18:13 被阅读0次

    一个Buffer就是一块内存,用于写入、读取数据。实际上的实现就是各种基本类型的数组包装到Buffer对象中,提供了一系列的方法来操作这个数组。

    基本读写:

    1. 向Buffer写入数据
    2. 调用buffer.flip()
    3. 读取Buffer中的数据
    4. 调用buffer.clear()
    // 将字符串转换位byte数组放入ByteBuffer
    String s = "hello world";
    // 创建一个ByteBuffer,容量64个字节
    ByteBuffer byteBuffer = ByteBuffer.allocate(64);
    // 将字符串byte数组放入ByteBuffer中
    byteBuffer.put(s.getBytes());
    // 在读取之前需要使用flip()方法
    byteBuffer.flip();
    // 读取一个byte
    System.out.println((char) byteBuffer.get());
    // 返回Buffer存储元素的数组
    byte[] bytes = byteBuffer.array();
    // limit()返回实际存储的最后一个元素的索引
    System.out.println(new String(bytes, 0, byteBuffer.limit()));
    

    Buffer内部概念

    buffer的字段:Buffer实际上是包装了一个数组,使用以下字段和方法可以更容易的操作数组,这些个字段的具体数值可以通过同名的方法返回

    private int position = 0;
    private int limit;
    private int capacity;
    
    • capacity是Buffer的容量,即数组的大小
    • 在写入时,position是下一个写入的索引,limit是Buffer的容量
    • 在读取之后调用flip(),position被重置为0,limit被重置为之前的position,这样就可以读取数据了

    Buffer方法

    分配一个Buffer:调用具体实现类的static方法:allocate(int),传入的时Buffer的大小

    Buffer有多种类型,其中ByteBuffer是最常用的,下面创建了个64字节大小的ByteBuffer

    ByteBuffer byteBuffer = ByteBuffer.allocate(64);
    

    写入数据:使用put方法写入字节或字节数组

    byteBuffer.put(s.getBytes());
    

    读取数据:使用get读取单个字节,可以传入byte数组,将数据写入数组;或者使用array方法返回Buffer封装的byte数组

    System.out.println((char) byteBuffer.get());
    byte[] bytes = byteBuffer.array();
    

    更常用的时从一个channel将数据写入Buffer

    // 数据写入buffer
    channel.read(bytebuffer);
    // 从buffer读取数据
    channel.write(bytebuffer);
    

    flip():在写入数据后调用,重置position和limit,然后可以读取Buffer中的数据

    public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }
    

    clear():在读取完数据后调用,重置position和limit,然后可以继续写入数据

    public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }
    

    Buffer类型

    java NIO 有以下几类Buffer:都是对基本类型数组的包装

    • ByteBuffer
    • MappedByteBuffer
    • CharBuffer
    • ShortBuffer
    • IntBuffer
    • LongBuffer
    • DoubleBuffer
    • FloatBuffer

    相关文章

      网友评论

          本文标题:java NIO Buffer

          本文链接:https://www.haomeiwen.com/subject/hnfdtktx.html