ByteBuffer 的初始“模式”是啥?

Posted

技术标签:

【中文标题】ByteBuffer 的初始“模式”是啥?【英文标题】:What is the initial "mode" of ByteBuffer?ByteBuffer 的初始“模式”是什么? 【发布时间】:2015-06-20 16:44:30 【问题描述】:

在研究ByteBuffer 类时,我想到了一个数组包装的 ByteBuffer,它可能构造如下:

byte data[] = new byte[10];
// Populate data array
ByteBuffer myBuffer = ByteBuffer.wrap(data);
int i = myBuffer.getInt();

我想,这可能会将我的字节数组的前 4 个字节检索为 int 值。然而,当我进一步研究时,我似乎发现 ByteBuffer 有两个 mode 可以读取和写入,我们可以使用flip() 方法在它们之间翻转。但是,由于翻转基本上是一种切换,因此它的前提是知道初始值才能在读取和写入状态之间进行有意义的翻转。

ByteBuffer的初始状态的定义是什么?

写? 读了吗? 它是如何创建的(例如分配与包装)的函数?

【问题讨论】:

【参考方案1】:

严格来说,ByteBuffer 本身不会跟踪它是“读”还是“写”;这只是它如何使用的功能。一个 ByteBuffer 可以随时读写。我们说翻转切换“模式”的原因是因为它是写入缓冲区、翻转缓冲区、然后从缓冲区读取的常见任务的一部分。

确实,allocate 和 wrap 都将限制和容量设置为等于数组大小,并将位置设置为零。这意味着读操作可以读取整个数组,而写操作可以填满整个数组。因此,您可以使用新分配或包装的 ByteBuffer 进行读取或写入。

【讨论】:

以上是关于ByteBuffer 的初始“模式”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从 ByteBuffer 获取到 byte[] 不写入到 byte[]

用 ByteBuffer 处理 byte[]

Netty——ByteBuffer的内部结构

Netty——ByteBuffer的内部结构

如何从 ByteBuffer 中获取已使用的 byte[]

浅谈ByteBuffer转换成byte[]时遇到的问题