Java Buffer
在Java NIO(New Input/Output)API中,Buffer是一个核心概念,它是数据的临时存储区域。与传统的Java I/O不同,NIO提供了基于缓冲区的数据处理方式,使得数据操作更加高效灵活。
什么是Buffer?
Buffer本质上是一个内存块,可以写入数据,之后再读取。在NIO中,所有数据的读写都是通过Buffer来完成的。
Buffer的基本属性
Java Buffer有几个重要的属性需要理解:
- 容量(capacity): Buffer能够容纳的数据元素的最大数量
- 限制(limit): 第一个不能被读或写的元素的索引
- 位置(position): 下一个要被读或写的元素的索引
- 标记(mark): 一个备忘位置,可以调用mark()设置mark为当前position,之后调用reset()可将position设为mark
这些属性总是满足以下关系:
0 <= mark <= position <= limit <= capacity
Buffer的类型
Java NIO提供了多种Buffer类型,每种对应一种基本数据类型:
- ByteBuffer
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
所有这些类都是抽象类Buffer的子类。
备注
最常用的是ByteBuffer,特别是在文件I/O和网络操作中。
创建Buffer
创建Buffer的方法有几种:
// 方法1:分配一个容量为1024的ByteBuffer
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 方法2:包装一个已有的数组
byte[] array = new byte[1024];
ByteBuffer buffer = ByteBuffer.wrap(array);
// 方法3:创建一个直接缓冲区(内存分配在JVM堆外)
ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024);
Buffer的基本操作
写入数据到Buffer
// 从Channel读取数据到Buffer
int bytesRead = channel.read(buffer);
// 或者通过put方法写入数据
buffer.put((byte) 127);
buffer.put(byteArray);
从Buffer读取数据
在读取数据之前,需要调用flip()
方法,将Buffer从写模式切换到读模式:
buffer.flip(); // 准备读取数据
// 读取一个字节
byte b = buffer.get();
// 或者读取多个字节到数组
byte[] dst = new byte[10];
buffer.get(dst);
// 读取完毕后,可以调用clear()方法重置buffer
buffer.clear();
// 或者调用compact()方法,保留未读取的数据并压缩
buffer.compact();