Buffer:

缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松的使用内存块,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变换情况,Channel提供从文件,网络读取数据的渠道,但是读取或者写入的数据都必须经由Buffer

Buffer类以及子类

1.Buffer是一个顶级父类,它是一个抽象类,有七个子类,除了boolean类型的,其他基本数据类型的buffer子类都有,最常用的就是ByteBuffer
2.buffer四个属性来提供关于其所包含的数据元素的信息
capacity: 容量,在缓冲区创建时设定 并且不可变
limit: 表示缓冲区当前的终点
position: 位置,下一个要读或者写的索引
mark: 标记

Buffer类常用的一些方法

在这里插入图片描述
最常用的bytebuffer的方法:
在这里插入图片描述
下面列举一个Buffer的读取与存入的例子:

package com.jym.nio;

import java.nio.IntBuffer;

/**
 * @program: JymNetty
 * @description: 举例说明Buffer的使用
 * @author: jym
 * @create: 2020/01/31
 */
public class JymBuffer {
    public static void main(String[] args) {
        // 创建一个Buffer,大小为5,即可以存放5个int
        IntBuffer intBuffer = IntBuffer.allocate(5);
        // 向Buffer存放数据, intBuffer.capacity()为buffer的容量,put方法为存放
        for(int i = 0; i<intBuffer.capacity();i++){
            intBuffer.put(i+10);
        }
        // 如何取出数据
        // 将buffer转换,读写切换,intBuffer.hasRemaining() 判断buffer里是否有数据
        intBuffer.flip();
        while (intBuffer.hasRemaining()){
            System.out.println(intBuffer.get());
        }
    }
}
这里需要注意的是:在读写的时候,必须要调用切换方法flip()

每次添加或者读取的时候,position都会增加1,一直到与limit为止

Buffer的注意事项:

1.ByteBuffer 支持类型化的put和get,put放入的是什么类型,get就应该使用对应的数据类型来取出,否则可能有BufferUnderflowException异常
2 可以将一个普通Buffer转成只读Buffer,如果往只读Buffer添加元素,会产生ReadOnlyBufferException
代码说明:

package com.jym.nio;

import java.nio.ByteBuffer;

/**
 * @program: JymNetty
 * @description: Buffer注意事项
 * @author: jym
 * @create: 2020/02/01
 */
public class JymFileChannle4 {
    public static void main(String[] args) {
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);
        // 读取的时候也一定要按照顺序读取,比如要指定类型,否则可能会出错
        byteBuffer.putChar('A');
        byteBuffer.putInt(3);
        byteBuffer.putShort((short) 4);
        byteBuffer.putLong(10086);


        // 转换成只读Buffer
        ByteBuffer readOnlyBuffer = byteBuffer.asReadOnlyBuffer();
        // 添加元素会报错ReadOnlyBufferException
        readOnlyBuffer.put((byte) 1);
    }
}
学习年限不足,知识过浅,说的不对请见谅。

世界上有10种人,一种是懂二进制的,一种是不懂二进制的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐