1.Bytebuffer介绍
在Java中,ByteBuffer是Java NIO(New Input/Output)库中的一个重要类,主要用于高效地处理原始字节数据。它是 java.nio.Buffer 抽象类的一个子类,专门设计用来读写字节流,尤其是在进行文件I/O操作、网络通信、数据打包与解包等场景中非常有用。
2.ByteBuffer的几个关键属性
容量(Capacity): ByteBuffer 具有一个固定的容量,即可以存储的最大字节数。这个容量在创建时确定,并且之后不可改变。通过 ByteBuffer.allocate(int capacity) 方法可以在Java堆内存中分配指定容量的 ByteBuffer。通过 ByteBuffer.allocateDirect(int capacity) 方法则可以在Java堆外内存(直接内存)中分配一个 ByteBuffer,适合处理大量数据且需要减少内存复制开销的情况。
限制(Limit): 表示当前缓冲区中实际有效的数据结束位置。即最多只能读取到限制位置的数据,或者最多只能写入到限制位置。
位置(Position): 表示下一个将要被读取或写入的字节的位置。每次调用读写方法(如 get() 或 put())后,位置都会自动前进到下一个待操作的字节处。
标记(Mark)与重置(Reset): 可以通过 mark() 方法设定一个标记点,然后通过 reset() 方法回到这个标记点,方便进行多次读写循环。
翻转(Flip): 使用 flip() 方法可以将缓冲区从写模式切换到读模式,同时将限制设置为当前位置,并将当前位置归零,准备开始读取刚刚写入的数据。
清除(Clear)与填充(Rewind): clear() 方法将缓冲区清空为初始状态,即位置设为0,限制设为容量;而 rewind() 方法将位置重置为0,但保留原有限制,允许从头开始再次读写。
3.多种方法使用
1.数据结构
ByteBuffer创建可以使用allocate或者warp直接创建。allocate创建指定容量的buffer,warp创建一个指定内容的buffer
position是当前指针,读写都是使用这个指针
2.put操作
每次执行put操作后,将当前位置设置值,然后position指针向后移动若干个位置。比如char类型是2个字节,会占用2个byte,position会移动2
3.flip操作
由于读和写都是在当前position位置操作,在写操作结束后要进行重头读取需要调用flip操作,
将position指针置为0,limit设置为当前在执行读取操作
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
4.get操作
读取操作将当前位置取出,然后将position指针进行移动,position无法超高limit
5.mark操作
mark操作将mark指针放置在position位置,用来记录上次位置
public final Buffer mark() {
mark = position;
return this;
}
6.reset方法
将position移动到mark位置,可以重新对当前位置进行操作。如果执行之前没有调用mark()方法或后续操作(position(int)如果指定位置小于mark位)将mark重置回-1,则抛出异常
public final Buffer reset() {
int m = mark;
if (m < 0)
throw new InvalidMarkException();
position = m;
return this;
}
7.position方法
将position指针移动到指定位置,并将之前保存的mark指针移动到-1位置
public final Buffer position(int newPosition) {
if ((newPosition > limit) || (newPosition < 0))
throw new IllegalArgumentException();
if (mark > newPosition) mark = -1;
position = newPosition;
return this;
}
8.slice方法
slice会创建一个新的byteByffer对象。不过能操作的空间不同,新对象指向原来地址空间的position到limit区间,每次修改数据,原来的byteBuffer也会修改