这个 ByteBuffer.allocate() 方法究竟创建了啥?

Posted

技术标签:

【中文标题】这个 ByteBuffer.allocate() 方法究竟创建了啥?【英文标题】:What is exactly created by this ByteBuffer.allocate() method?这个 ByteBuffer.allocate() 方法究竟创建了什么? 【发布时间】:2017-04-18 18:05:50 【问题描述】:

在一个 Java 应用程序中我发现了这一行:

ByteBuffer b = ByteBuffer.allocate(Integer.SIZE / 8);

它创建了一个 ByteBuffer 对象(我认为它是用来读取和写入单个字节的。那么它是什么意思?我可以在这个对象中放入和读取只字节?)。

所以 ByteBuffer.allocate() 方法看起来有点像返回 Byte 的工厂方法。

但究竟是什么分配传递 Integer.SIZE / 8 值作为输入参数?

【问题讨论】:

不,Integer.SIZE 是 32,因此创建了一个 4 字节缓冲区。不,它不是返回Byte,而是返回ByteBuffer 【参考方案1】:

究竟是什么分配传递 Integer.SIZE / 8 值作为输入 参数?

它正在创建一个容量为 4 字节 (32/8) 的 ByteBuffer 实例。 如果您在 ByteBuffer 实例中放置了多个整数(或 4 个字节),则会抛出 java.nio.BufferOverflowException

它创建了一个 ByteBuffer 对象(我认为它是用来读写的 单字节。那么这意味着什么呢?我可以只放入和读取字节 这个对象?)。

您可以输入byte,也可以输入除布尔值之外的所有其他原始类型:intlongshortfloatdoubleput(byte b)method 写入一个字节。 putInt(int value) 写入一个 int。 所以对于..

所以 ByteBuffer.allocate() 方法似乎类似于 返回 Byte 的工厂方法。

确实是工厂方法,但不是返回Byte,而是返回ByteBuffer 实例。 事实上,ByteBuffer 类不能从客户端类实例化:它是一个抽象类。

所以ByteBuffer.allocate() 实例化了ByteBuffer 类的实现并将其返回给客户端:

ByteBuffer allocate = ByteBuffer.allocate(Integer.SIZE / 8);

所以你可以写:

allocate.putInt(1);

【讨论】:

以上是关于这个 ByteBuffer.allocate() 方法究竟创建了啥?的主要内容,如果未能解决你的问题,请参考以下文章

构造函数中的 ByteBuffer.allocate

如果我们超过了java中ByteBuffer.allocate(48) NIO包类中分配缓冲区的容量怎么办

ByteBuffer类学习

这个 Java ByteBuffer 的行为有解释吗?

ByteBuffer 下溢

HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer