NIO-ByteBuffer
一、ByteBuffer
官方解释A byte buffer,一个字节缓冲区。
二、ByteBuffer的扩展

Bytebuffer UML图
- | 描述 | 优点 |
---|---|---|
HeapByteBuffer | 在jvm堆上面的一个buffer,底层的本质是一个数组 | 由于内容维护在jvm里,所以把内容写进buffer里速度会快些;并且,可以更容易回收 |
DirectByteBuffer | 底层的数据其实是维护在操作系统的内存中,而不是jvm里,DirectByteBuffer里维护了一个引用address指向了数据,从而操作数据 | 跟外设(IO设备)打交道时会快很多,因为外设读取jvm堆里的数据时,不是直接读取的,而是把jvm里的数据读到一个内存块里,再在这个块里读取的,如果使用DirectByteBuffer,则可以省去这一步,实现zero copy |
三、ByteBuffer的属性及方法
ByteBuffer的属性
byte[] buff //buff即内部用于缓存的数组。
position //当前读取的位置。
mark //为某一读过的位置做标记,便于某些时候回退到该位置。
capacity //初始化时候的容量。
limit //当写数据到buffer中时,limit一般和capacity相等,当读数据时,limit代表buffer中有效数据的长度。
ByteBuffer的常规方法
ByteBuffer allocate(int capacity) //创建一个指定capacity的ByteBuffer。
ByteBuffer allocateDirect(int capacity) //创建一个direct的ByteBuffer,这样的ByteBuffer在参与IO操作时性能会更好
ByteBuffer wrap(byte [] array)
ByteBuffer wrap(byte [] array, int offset, int length) //把一个byte数组或byte数组的一部分包装成ByteBuffer。
//get put方法不多说
byte get(int index)
ByteBuffer put(byte b)
int getInt() //从ByteBuffer中读出一个int值。
ByteBuffer putInt(int value) // 写入一个int值到ByteBuffer中。
ByteBuffer的特殊方法
Buffer clear() 把position设为0,把limit设为capacity,一般在把数据写入Buffer前调用。
Buffer flip() 把limit设为当前position,把position设为0,一般在从Buffer读出数据前调用。
Buffer rewind() 把position设为0,limit不变,一般在把数据重写入Buffer前调用。
compact() 将 position 与 limit之间的数据复制到buffer的开始位置,复制后 position = limit -position,limit = capacity, 但如 果position 与limit 之间没有数据的话发,就不会进行复制。
mark() & reset() 通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset()方法恢复到这个position。
各个操作

PUT
写模式下,往buffer里写一个字节,并把postion移动一位。写模式下,一般limit与capacity相等。
GET
从buffer里读一个字节,并把postion移动一位。上限是limit,即写入数据的最后位置。
Flip
一般是读数据之前,将limit = position, position = 0 ,hasRemaining()方法里面其实是 position < limit
Clear
写数据的时候使用,将position = 0 ,并不清除buffer 内容
mark & reset
mark相关的方法主要是mark()(标记)和reset()(回到标记).
本文作者:志旋
本文链接:https://www.cnblogs.com/wuzhixuan/p/15122250.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步