byteBuffer

基本使用实例:

data文件内容:
1234567890abc
    public static void main(String[] args) {
        try (FileChannel channel = new FileInputStream("data.txt").getChannel()) {
            // 准备缓冲区
            ByteBuffer buffer = ByteBuffer.allocate(10);
            while (true) {
                // 读取数据
                int len = channel.read(buffer);
                log.info("字节数:" + len);
                if (len == -1) {
                    // 没有内容跳出循环
                    break;
                }
                // 打印buffer内容
                buffer.flip(); // 切换读模式
                while (buffer.hasRemaining()) {
                    byte b = buffer.get();
                    log.info(String.valueOf((char) b));
                }
                buffer.clear();// 切换到写模式
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

WX20220422-223949@2x

总结使用方式:

  1. 向buffer写入数据 channel.read(buffer)
  2. 切换到读模式
  3. 读数据 buffer.get()
  4. 切换到写模式,clear()或compact()
  5. 重复1-4 直到读取的长度为-1结束

ByteBuffer结构

ByteBuffer继承Buffer类,部分源码:
WX20220423-164909@2x
其中重要属性:

  • capacity
  • position
  • limit

写模式下,position是写入位置,limit等于容量

WX20220423-164423@2x

flip动作发生后,position切换为读取位置,limit切换为读取限制

WX20220423-170039@2x

clear方法切换到写模式,position就会回到0从头写

WX20220423-165754@2x

compact是把未读完的部分向前压缩,然后切换到写模式

WX20220423-170321@2x