- Buffer介绍
Buffer实际上是一块内存区域,由java.nio.Buffer封装起来,提供读写的接口。Buffer的实现类有以下几种,包括了基本的数据类型:ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,FloatBuffer,DoubleBuffer,LongBuffer。
- Buffer字段
- Capacity: Buffer创建时分配内存大小,(通过ByteBuffer.allocate(int Capacity)分配),放置写入的数据,这一容量在缓冲区创建时被设定,并且永远不能被改变。
- Limit:缓冲区的第一个不能被读或写的元素。缓冲创建时,limit 的值等于 capacity 的值。
- Position:下一个要被读或写的元素的索引。位置会自动由相应的 get() 和 put() 函数更新。
- 标记(Mark):一个备忘位置,用来临时标记一下当前position。例子:如果当前position是2,我们需要在位置5写或读取数据,那么,你需要调用mark(),然后调用position(5)跳到你需要的位置,处理完后,调用reset()把position置回mark的位置,即2。
在正常情况下:mark <= position <= limit <= capacity。
限制你不能通过reset()把position的位置往前调,否则会报错。
- Buffer方法
position(int newPosition) | 设置position位置,newPosition <= limit。如果当前mark的位置大于newPosition,则mark置为-1,此时无法reset()。 |
limit(int newLimit) | 设置limit值。 |
mark() | 令mark = position,对当前position作标记。 |
reset() | 在调用mark之后调用Buffer.reset()方法恢复到这个position。调用成功前提是mark <= 当前position |
flip() | 把Buffer从写模式切换到读模式。把position归零,并设置limit为之前的position的值。 此时你可从position位置开始读0-limit这一段的数据。 |
rewind() | 将position置为0,重复读取buffer中数据。limit保持不变(此时mark也会变为-1)。 |
clear() | position将被设回0,limit被设置成 capacity的值,相当于切换成从0开始的写模式, |
compact() | 与clear()不同的是,如果Buffer还有一些数据没有读取完(即读模式下的position<limit),会把这些未读完的数据放在buffer开头,令position的值为未读完数据之后。 |
- 用例
import java.nio.ByteBuffer;
public class Main {
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(30);
System.out.println("capacity:" + buffer.capacity());
buffer.put("123456789".getBytes());
System.out.println("当前buffer状态:\n " + buffer);
System.out.println("当前buffer数据:\n " + new String(buffer.array()));
buffer.flip();
System.out.println("flip(切换为读模式):\n " + buffer);
System.out.print("读取三个单位:\n ");
System.out.print((char) buffer.get());
System.out.print((char) buffer.get());
System.out.println((char) buffer.get());
System.out.println("读取三个单位后buffer状态:\n " + buffer);
buffer.compact();
//因为刚才还有6个单位没有读完,compact会把它们复制到前,把position置为6
System.out.println("compact后buffer状态:\n " + buffer);
System.out.println("compact后buffer数据:\n " + new String(buffer.array()));
buffer.put("123".getBytes());
System.out.println("往buffer写3个单位(从compact后的position位置):\n " + new String(buffer.array()));
}
}