Java ByteBuffer
1. ByteBuffer 6大类操作
num | method | desc |
---|---|---|
1 |
get ,put(byte)
|
|
2 | get(byte[]) |
|
3 | put(byte) |
|
4 |
getChar() ,putChar(char)
|
|
5 | view buffer | allow a byte buffer to be viewed as a buffer containing values of some other primitive type |
6 |
compact ,duplicate ,slice
|
Byte Buffer
的创建方式:
- allocation
-
wrap(byte[])
: 将byte array
转成一个buffer
2. Direct vs non-direct buffers
-
byte buffer
是不是只有direct/non-direct 2种?是的
-
为什么会有direct形式的buffer?
JVM will make a best effort to perform native I/O operations directly upon it. That is, it will attempt to avoid copying the buffer's content to (or from) an intermediate buffer before (or after) each invocation of one of the underlying operating system's native I/O operations
-
java中如何创建一个direct buffer?
ByteBuffer.allocateDirect(int capacity)
,具体是一个DirectByteBuffer
-
direct buffer的缺点?
分配和回收的时候开销大于not-direct的buffer,这块内存是独立于gc可回收的堆,需要格外注意
-
direct buffer的应用场景?
It is therefore recommended that direct buffers be allocated primarily for large, long-lived buffers that are subject to the underlying system's native I/O operations. In general it is best to allocate direct buffers only when they yield a measureable gain in program performance
-
direct buffer另外的创建方式?
java.nio.channels.FileChannel#map
将一个文件的区域直接映射到内存,具体是一个MappedByteBuffer
-
怎么判断一个buffer是不是direct的?
isDirect()
,在ByteBuffer
的3中实现里面写死了(DirectByteBuffer
,DirectByteBufferR
,HeapByteBuffer
)
3. 访问(读/写)二进制数据
除了boolean
类型以外,都可以根据buffer当前的ByteOrder
将bytes序列转换成/转换自 基本类型
1. 访问 heterogeneous binary data
-
绝对访问:
getFloat()
,putFloat(float f)
-
相对访问:
getFloat(int index)
,putFloat(int index, float f)
,其中index
表示的单位是以byte为单位,而不是以读的类型为单位(即index
和index+1
之间差了1个byte/8bit,而不是8bit/16bit/32bit/64bit这种因类型而变的bit)
2. 访问 homogeneous binary data
因为此时buffer(byte array)中的数据都是同一个类型,所以可以在其上做一层抽象,底层依然是一个byte buffer
,所以称其为view buffer
,使用asFloatBuffer
这样的方法创建
view buffer
的访问方式比上面提到的访问方式有以下3点好处:
- 其
index
是以类型的单位的 - 相对访问形式的批量
get,put
方法,将buffer中连续的值转化为array,或者反之 -
view buffer
拥有其下buffer的direct/non-direct属性和byte order