Java NIO(New I/O)里的**缓冲区(Buffer)**是核心概念之一,所有数据的读写都要经过 Buffer。下面从概念、常用类、基本用法到示例给你讲清楚。
Buffer 是一个线性、有限的容器,用于临时存放数据。
在 NIO 中:
常见 Buffer 类型:
ByteBuffer(最常用)CharBufferIntBufferDoubleBuffer 等理解这三个属性非常关键:
| 属性 | 含义 |
|---|---|
| capacity | 缓冲区最大容量(创建后不可变) |
| limit | 当前可操作数据的边界 |
| position | 当前读写位置 |
关系:
0 <= position <= limit <= capacity
ByteBuffer buffer = ByteBuffer.allocate(1024); // 堆内存
// 或
ByteBuffer buffer = ByteBuffer.allocateDirect(1024); // 直接内存(性能更好)
buffer.put("Hello".getBytes());
或者通过 Channel 写:
channel.read(buffer);
⚠️ 非常重要
buffer.flip();
作用:
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
System.out.println(new String(bytes));
或通过 Channel 写:
channel.write(buffer);
buffer.clear(); // 清空,可重新写
// 或
buffer.compact(); // 保留未读数据
try (FileChannel channel =
FileChannel.open(Paths.get("test.txt"),
StandardOpenOption.CREATE,
StandardOpenOption.WRITE)) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put("Hello NIO".getBytes());
buffer.flip();
channel.write(buffer);
} catch (IOException e) {
e.printStackTrace();
}
try (FileChannel channel =
FileChannel.open(Paths.get("test.txt"), StandardOpenOption.READ)) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
int read = channel.read(buffer);
buffer.flip();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
System.out.println(new String(data));
} catch (IOException e) {
e.printStackTrace();
}
✅ 写完必须 flip() 才能读
✅ 读完考虑 clear() 或 compact()
✅ remaining() = limit - position
✅ allocateDirect 适合大文件、长生命周期
buffer.put()
buffer.get()
buffer.flip()
buffer.clear()
buffer.compact()
buffer.rewind()
buffer.mark()
buffer.reset()
buffer.remaining()
如果你愿意,我可以:
你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。