在 Java NIO 中,Buffer(缓冲区) 是用来在内存中临时存储数据、并与 Channel 进行交互的核心组件。可以把 Buffer 理解成一个“带指针的数组”。
下面从 概念 → 核心属性 → 常用方法 → 使用示例 逐步说明。
Buffer 是一个抽象类,常见实现有:
ByteBuffer(最常用)CharBufferIntBufferDoubleBuffer 等Channel 负责传输,Buffer 负责存储
capacity >= limit >= position >= mark
| 属性 | 含义 |
|---|---|
| capacity | 缓冲区最大容量(创建后不可变) |
| limit | 可读/可写的界限 |
| position | 当前读写位置 |
| mark | 标记位置(可选) |
buffer.put(data);
position 增加limit = capacitybuffer.flip(); // 切换为读模式
buffer.get();
limit = positionposition = 0ByteBuffer buffer = ByteBuffer.allocate(1024); // 堆内存
ByteBuffer buffer2 = ByteBuffer.allocateDirect(1024); // 直接内存
buffer.put("hello".getBytes());
buffer.flip();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
buffer.clear(); // 清空(可重写)
buffer.compact(); // 保留未读数据
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class BufferDemo {
public static void main(String[] args) throws Exception {
RandomAccessFile file = new RandomAccessFile("test.txt", "rw");
FileChannel channel = file.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = channel.read(buffer);
while (bytesRead != -1) {
buffer.flip(); // 切换读模式
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear(); // 清空准备下一次读
bytesRead = channel.read(buffer);
}
channel.close();
file.close();
}
}
❌ 忘记 flip()
✅ 写完后必须 flip() 才能读
❌ 读完后不 clear()
✅ 否则无法继续写入
❌ 混淆 clear() 和 compact()
clear():全部清空compact():保留未读数据如果你愿意,我也可以:
你想深入哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。