NIO BUFFER

Buffer

I/O缓冲区操作简图:
image

两个概念:用户空间和内核空间

用户空间: 是常规进程所在区域,JVM就是常规进程,驻守于用户空间,用户空间为非特权区域(不能直接访问硬件设备)。

内核空间: 是指操作系统所在区域,内核代码有特别的权利(能与设备控制器通讯,控制着用户空间进程的运行状态等等,最重要的是,所有的IO都直接或间接的通过内核空间)。

注:计算机磁盘是基于块存储的硬件设备,也就是说,它操作的是固定大小的数据块,而用户进程请求的可能是任意大小的或非对齐的数据块。在数据往来于用户空间与存储设备的过程中,内核负责
数据的分解、再组合工作,因此充当着中间人的角色。
一个Buffer对象是固定数量的数据的容器,它其实就是一个存储器,类似于List或数组。这里的数据可被存储并在之后用于检索。
每个非布尔的原始基本类型都有对应的缓冲区类(Buffer)。尽管缓冲区类保存的是原始数据类型,但是它更倾向于操作字节处理。

Buffer继承类图如下:

image

属性:

所有的缓冲区都有4个属性来提供它所包含的数据元素的信息:
- 容量(Capactiy):缓冲区能够容纳数据元素的最大数量,它在缓冲区创建时被设定,并且一旦设定不能被改变。
- 上界(Limit):缓冲区现存元素的数量。
- 位置(Position):下一个元素的索引,位置由get()或者put()方法自动更新。
- 标记(Mark):一个备忘位置,在设定它之前为(-1)。mark()设定mark = position | reset()设定position = mark

这四个属性总是以下关系:
0 <= mark <= position <= limit <= capacity

创建缓冲区类

创建缓冲区类有两种方式:
  • 通过申请空间的方式创建:
ByteBuffer buffer = ByteBuffer.allocate(100);
  • 通过包装方式创建:
byte[] buf = new byte[100];
ByteBuffer buffer = ByteBuffer.wrap(buf);

ByteBuffer buffer = ByteBuffer.wrap(buf, 2,8);

上述两种创建方式中,第一种为ByteBuffer内部自建一个私有数组进行缓冲,数组创建在堆内存上。第二种又有两种方式,不过都需要自创建一个数组,作为数据备份数组,当我们给Buffer填充值以后,同时我们自建的数组中也可以访问到值了。
*.wrap(buf,int offset,limit)表示传入一个数组buf,从offset位置传值,定点临界值为limit,此时Buffer的capacity的值为:offset+limit

当写完Buffer后,需要读Buffer时,必须调用flip()方法,该方法是将写模式切换为读模式,并且将position置为0,limit置为写模式时的position,以便能正确的读取到数据。

注:limit不能超过buf.length,否则报错
put值时,position小于offset除非显示指定,否则报错。
put(E e), put(int position, E e)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值