缓冲区(Buffer)是一个线性的、有序的数据集,一个缓冲区只能够容纳一种数据类型。该类定义如下:
public abstract class Buffer extends Object{}
Buffer是一个抽象类,所以提供了一个缓存操作的标准。如果要保存不同的数据类型,则应该使用Buffer的不同子类,常见的子类有:
- ByteBuffer
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
在Buffer中存在一系列的状态变量,这些状态变量随着写入或读取都有可能会被改变。在缓冲区可以使用3个值表示缓冲区的状态:
- position:表示下一个缓冲区读写获取或写入的操作指针,每向缓冲区中写入数据的时候此指针就会改变,指针永远放到写入的最后一个元素后,即如果写入了4个位置的数据,则position就会指向第五个位置。
- limit:表示还有多少数据需要存储或读取,position<=limit。
- capacity:表示缓冲区的最大容量,limit<=capacity。此值在分配缓冲区时被设置,一般不会更改。
1、观察缓冲区的使用的例子:
package com.mydemo;
import java.nio.ByteBuffer;
public class NIOBufferDemo {
public static void main(String[] args) {
// 定于操作数据,长度为13
String str = "uchihayuusuke";
// 创建缓冲区,容量为20
ByteBuffer byteBuffer = ByteBuffer.allocate(20);
// 没有存放数据时的参数:
System.out.println("【1-创建缓冲区】没有存放数据:capacity = " + byteBuffer.capacity() +
"、 limit = " + byteBuffer.limit() +
"、 position" + byteBuffer.position());
System.out.println("------------------------");
// 缓冲区存放数据
byteBuffer.put(str.getBytes());
// 存放数据时的参数:
System.out.println("【2-存放数据】保存数据:capacity = " + byteBuffer.capacity() +
"、 limit = " + byteBuffer.limit() +
"、 position" + byteBuffer.position());
System.out.println("------------------------");
// 准备输出
byteBuffer.flip();
// 存放数据时的参数:
System.out.println("【3-重置缓冲区】保存数据:capacity = " + byteBuffer.capacity() +
"、 limit = " + byteBuffer.limit() +
"、 position" + byteBuffer.position());
System.out.println("------------------------");
// 缓冲区中是否有数据
while (byteBuffer.hasRemaining()){
// 返回字节数据
System.out.print(byteBuffer.get() + "、");
}
System.out.println();
System.out.println("------------------------");
// 清空缓冲区
byteBuffer.clear();
// 存放数据时的参数:
System.out.println("【4-清空缓冲区】保存数据:capacity = " + byteBuffer.capacity() +
"、 limit = " + byteBuffer.limit() +
"、 position" + byteBuffer.position());
}
}
运行结果:
【1-创建缓冲区】没有存放数据:capacity = 20、 limit = 20、 position0
------------------------
【2-存放数据】保存数据:capacity = 20、 limit = 20、 position13
------------------------
【3-重置缓冲区】保存数据:capacity = 20、 limit = 13、 position0
------------------------
117、99、104、105、104、97、121、117、117、115、117、107、101、
------------------------
【4-清空缓冲区】保存数据:capacity = 20、 limit = 20、 position0