☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基
在Java NIO(New I/O)中,Buffer是一个重要的组件,它作为数据的容器,主要用于数据的读写操作。Buffer本质上是一个内存块,可以写入数据,也可以从中读取数据。
Buffer的基本概念
Buffer是一个抽象类,对应于Java的主要数据类型,在NIO中有8种缓冲区类,分别是ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer和MappedByteBuffer。这些不同的Buffer子类对应于Java的主要数据类型,每种子类能操作的数据类型可以通过名称进行判断。
Buffer的主要类型
- ByteBuffer:用于字节数据的读写。
- CharBuffer:用于字符数据的读写。
- DoubleBuffer:用于双精度浮点数数据的读写。
- FloatBuffer:用于单精度浮点数数据的读写。
- IntBuffer:用于整数数据的读写。
- LongBuffer:用于长整数数据的读写。
- ShortBuffer:用于短整数数据的读写。
- MappedByteBuffer:用于映射文件区域的读写。
Buffer的关键属性
- 容量(Capacity):表示Buffer的最大数据容量,一旦初始化就不能改变。
- 位置(Position):表示下一个要被读或写的元素的索引。它的值由get( )和put( )函数自动更新。
- 限制(Limit):表示第一个不应该读或写的元素的索引。在写模式下,limit等于Buffer的capacity;在读模式下,limit表示最多能从缓冲区中读取到多少数据。
Buffer中数据读写操作的基本流程
-
写入数据:通过调用Buffer的put( )方法向Buffer中写入数据。数据会被写入到position指针所指向的位置,并且position指针会向前移动。如果需要写入大量数据,可以使用Buffer的bulk put( )方法提高写入效率。
-
读取数据:通过调用Buffer的get( )方法从Buffer中读取数据。数据会被读取到position指针所指向的位置,并且position指针会向前移动。同样地,如果需要读取大量数据,可以使用Buffer的bulk get( )方法提高读取效率。
-
重置position:如果需要重新读取已读过的数据,可以使用mark( )方法设置一个标记,然后调用reset( )方法将position重置为mark的值。
-
清除Buffer:如果需要清除Buffer中的数据,可以使用clear( )方法将position和limit都设置为0,同时将capacity保持不变。如果需要将Buffer中的数据全部置为某个值,可以使用flip( )方法将limit设置为position之前的值,然后将position设置为0。
Java NIO Buffer相关类的使用示例
下面是一个使用ByteBuffer的示例,演示了如何向Buffer中写入数据并读取它们:
// 创建一个ByteBuffer对象,初始容量为10
ByteBuffer buffer = ByteBuffer.allocate(10);
// 写入数据
for (int i = 0; i < 5; i++) {
buffer.put((byte) i);
}
// 切换到读模式
buffer.flip();
// 读取数据
while (buffer.hasRemaining()) {
byte b = buffer.get();
System.out.print(b + " ");
}
在这个示例中,我们首先创建了一个容量为10的ByteBuffer对象。然后,通过调用put( )方法向Buffer中写入了5个字节的数据。接下来,调用flip( )方法将Buffer切换到读模式,并通过get( )方法从Buffer中读取数据,直到没有剩余数据为止。