java TCP/IP Socket编程-----NIO--Buffer-----笔记10

概述:

在NIO中,数据的读写操作始终是与缓冲区相关联的。Channel将数据读入缓冲区,然后我们又从缓冲区访问数据。写数据时,首先将要发送的数据按顺序填入缓冲区。基本上,缓冲区只是一个列表,它的所有元素都是基本数据类型(通常为字节型)。缓冲区是定长的,它不像一些类那样可以扩展容量(例如,List,StringBuffer等)。注意,ByteBuffer是最常用的缓冲区,因为:1)它提供了读写其他数据类型的方法,2)信道的读写方法只接收ByteBuffer。总结来说就是Buffer就像一个数组


1、存储和接收数据

只要有了缓冲区,就可以用它来存放数据了。作为数据的"容器",缓冲区既可用来输入也可用来输出。这一点就与流不同,流只能向一个方向传递数据。使用put()方法可以将数据放入缓冲区,使用get()方法则可以从缓冲区获取数据。信道的read()方法隐式调用了给定缓冲区的put(),而其write()方法则隐式调用了缓冲区的get()方法。

这里不明白就是(read 对应的是put() write对应get())

相对位置:

byte get()

ByteBuffer get(byte[] dst)

ByteBuffer get(byte[] dst, int offset, int length)

ByteBuffer put(byte b)

ByteBuffer put(byte[] src)

ByteBuffer put(byte[] src, int offset, int length)

ByteBuffer put(ByteBuffer src)

绝对位置

byte get(int index)

ByteBuffer put (int index, byte b)

这里里面position类似一个指针,get/put都会往后移动,如果超过limit就会抛出异常

ByteOrder order() 字节的顺序

ByteBuffer order(ByteOrder order)

2.Buffer关键方法 clear() flip() 和rewind()以及compact()

clear()方法可以将position设置为0 limit设置等于capacity(容量)

flip()方法用来将缓冲区准备为数据传出状态,这通过将limit设置为position的当前值,再将 position的值设为0来实现

rewind()方法将position设置为0,并使mark值无效。这很像flip()方法的操作,只是limit的值没变

compact()方法将 position与limit之间的元素复制到缓冲区的开始位置,从而为后续的 put()/read()调用让出空间。复制数据是一个非常耗费系统资源的操作,因此要保守地使用compact()方法。

3.Buffer透视:duplicate() slice()

duplicate()方法用于创建一个与原始缓冲区共享内容的新缓冲区。新缓冲区的position,limit,mark和capacity都初始化为原始缓冲区的索引值,然而,它们的这些值是相互独立的。

slice()方法用于创建一个共享了原始缓冲区子序列的新缓冲区。新缓冲区的position值是0,而其limit和capacity的值都等于原始缓冲区的limit和position的差值。slice()方法将新缓冲区数组的offset值设置为原始缓冲区的position值,然而,在新缓冲区上调用array()方法还是会返回整个数组。

总结:没有例子总是那么枯燥。。。。。。。。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值