Java NIO基本组件Buffer详解

85 篇文章 1 订阅

Buffer基本介绍

对数据读取、写入要用buffer,本质就是一个容器对象——数组(内存块)。

Channel提供从文件、网络读取数据的渠道,但是读取、写入都是经由Buffer
在这里插入图片描述

在这里插入图片描述

Buffer最常用的类

在这里插入图片描述

Buffer缓冲区状态变量

mark(标记):标记position位置,给reset用的,当回退到上一次可以调用reset,就会把mark赋值给position
position(位置):当前读写的位置
limit(上界):缓冲区现存元素的计数
capacity(容量):最大容量

0 <= mark <= position <= limit <= capacity
在这里插入图片描述

写入缓冲区

写入一个字节,position移动1格,position就是当前写入位置
在这里插入图片描述

读取缓冲区

调用buffer.flip() 切换到读模式,position就会移动到数据开头,limit会移动到数据结尾
在这里插入图片描述
每读一个字节,position移动1格,直到position=limit
在这里插入图片描述

Mark作用

调用buffer.mark()标志此时位置,然后再读取,position已经到limit
在这里插入图片描述
此时如果要从上一步开始读(也就是mark位置)
调用buffer.reset() 把position恢复到mark位置
在这里插入图片描述

还原缓冲区在这里插入图片描述

调用buffer.clear() 清除缓冲区,还原到最初状态
在这里插入图片描述

压缩缓冲区

调用buffer.compact() 申请一个新的缓冲区,把中间两个数据移到起始位置
在这里插入图片描述

代码演示

    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        //输出缓冲区初始空间1024
        System.out.println(buffer);//java.nio.HeapByteBuffer[pos=0 lim=1024 cap=1024]
        buffer.putInt(1);
        buffer.putInt(2);
        buffer.putInt(3);
        //输出已经写入的12个字节的缓冲区(1个int=4个byte)
        System.out.println(buffer);//java.nio.HeapByteBuffer[pos=12 lim=1024 cap=1024]
        //调用buffer.flip() 切换到读模式
        buffer.flip();
        //输出缓冲区可读字节
        System.out.println(buffer.remaining());//remaining代表可读位可写位,limit - position,可读字节12
        //输出缓冲区
        System.out.println(buffer);//java.nio.HeapByteBuffer[pos=0 lim=12 cap=1024]
        //取出数据
        int myInt= buffer.getInt();
        //记录mark位置
        buffer.mark();
        int myInt1= buffer.getInt();
        int myInt2=buffer.getInt();
        System.out.println(myInt);//1
        System.out.println(myInt1);//2
        System.out.println(myInt2);//3
        //把position恢复到mark位置
        buffer.reset();
        int myInt3= buffer.getInt();
        int myInt4= buffer.getInt();
        System.out.println(myInt3);//2
        System.out.println(myInt4);//3

        System.out.println(buffer);//java.nio.HeapByteBuffer[pos=12 lim=12 cap=1024]
        System.out.println(buffer.remaining());//这时,pos=lim,可读字节0
        //清除缓冲区,还原到最初状态
        buffer.clear();
        System.out.println(buffer);//java.nio.HeapByteBuffer[pos=0 lim=1024 cap=1024]
        System.out.println(buffer.remaining());//1024
    }

输出结果

在这里插入图片描述

Channel与Buffer关系

https://blog.csdn.net/weixin_44371237/article/details/122284606

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值