这个 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
,也可以输入除布尔值之外的所有其他原始类型:int
、long
、short
、float
和 double
。put(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() 方法究竟创建了啥?的主要内容,如果未能解决你的问题,请参考以下文章