温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java nio中buffer怎么用

发布时间:2026-09-22 20:55:15 来源:亿速云 阅读:88 作者:小樊 栏目:编程语言

在 Java NIO 中,Buffer(缓冲区) 是用来在内存中临时存储数据、并与 Channel 进行交互的核心组件。可以把 Buffer 理解成一个“带指针的数组”。

下面从 概念 → 核心属性 → 常用方法 → 使用示例 逐步说明。


一、Buffer 是什么

Buffer 是一个抽象类,常见实现有:

  • ByteBuffer(最常用)
  • CharBuffer
  • IntBuffer
  • DoubleBuffer 等

Channel 负责传输,Buffer 负责存储


二、Buffer 的四个核心属性

capacity >= limit >= position >= mark
属性 含义
capacity 缓冲区最大容量(创建后不可变)
limit 可读/可写的界限
position 当前读写位置
mark 标记位置(可选)

三、Buffer 的两种模式

1️⃣ 写模式(向 Buffer 写数据)

buffer.put(data);
  • position 增加
  • limit = capacity

2️⃣ 读模式(从 Buffer 读数据)

buffer.flip(); // 切换为读模式
buffer.get();
  • limit = position
  • position = 0

四、常用方法

创建 Buffer

ByteBuffer 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():保留未读数据

七、使用建议

  • 网络 / 文件 IO:优先用 ByteBuffer
  • 高频 IO:可用 DirectBuffer
  • 不要频繁创建 Buffer(复用)

如果你愿意,我也可以:

  • 画一张 Buffer 状态变化图
  • 对比 NIO 和 IO
  • 讲 Selector + Buffer 实战

你想深入哪一块?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手