nio-buffer

Nio 是一种非阻塞io模型,在java1.4引入

  • Buffer 缓存区

  • 在nio中,所有数组都是通过缓冲区进行处理的
  • bytebuffer 除了直接内存开辟,底层都是使用了byte[] 作为媒介
  • 几个重要的概念
  • 容量 (capacity) :表示 Buffer 最大数据容量,缓冲区容量不能为负,并且创建后不能更改。
  • 限制 (limit) :第一个不应该读取的数据的索引,即位于 limit 后的数据不可读。缓冲区的限制不能为负,并且不能大于其容量。
  • 位置 (position):下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制
  • 标记 (mark) 与重置 (reset) :标记是一个索引,通过 Buffer 中的 mark() 方法指定 Buffer 中一个特定的 position,之后可以通过调用 reset() 方法恢复到这个 position.
  • 代码

  • 创建一个1024大小的缓冲区
//这里的1024 表示缓冲区的容量
ByteBuffer allocate = ByteBuffer.allocate(1024);
  • 向缓冲区添加数据, 我们可以向缓存区中添加不同类型的数组,nio已经做好了封装

        allocate.putLong(1);

        allocate.putInt(2);
        
        allocate.putDouble(1.2);
  • 读取数据
		
        allocate.flip(); //将缓存区界限设置为当前位置,并将当前位置重置为0,相当于切换成了读模式
        
         //这里可以想象成了一个解包的过程,我们必须按照加入的顺序读取类型,否则会导致数据不一致
        long aLong = allocate.getLong();

        System.out.println(aLong);
  • 标记与恢复
		
        allocate.mark();//创建一个position标记
        
        long aLong = allocate.getLong();

        int anInt = allocate.getInt();
       
        System.out.println(aLong);

        System.out.println(anInt);

        allocate.reset(); //恢复到标记处的position

        long aLong1 = allocate.getLong();

        System.out.println(aLong1);

堆外内存

  • buffer 中提供了一个很重要的功能,可以让我们直接开辟物理内存,相当于c 语言的 malloc
       ByteBuffer bytebuffer = ByteBuffer.allocateDirect(1024);
  • 优点 可以减少一次拷贝,提供访问速度

  • 缺点 不好把握,容易内存泄露

  • 直接内存什么时候释放

  • 该块内存不受jvm管理,内部使用了unsafe开辟与回收,当bytebuffer 实例需要被gc回收,会调用unsafe.freeMemory() 释放内存,所以不使用了我们直接bytebuffer=null; 就可以回收掉

  • buffer 中还有一些其它的实现类

  • LongBuffer

  • IntBuffer

  • 除可boolean 没有基本类型都有对应的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值