ByteBuffer用法

简介: 笔记

ByteBufer简介


ByteBufer是用来处理子节的,比传统的数组的效率要高。

HeapByteBuffer用子节数组封装的一种的ByteBuffer,分配在堆上,受GC控制。

DircectByteBuffer不是分配在堆上,不受GC控制。

两者的区别

  1. 创建和释放DirectByteBuffer的代价要比HeapByteBuffer要高
  2. DirectByteBuffer的读写的操作要比HeapByteBuffer要快


基本使用


1. HeadByteBuffer

ByteBuffer heapByteBuffer = ByteBuffer.allocate(20);

源码如下:

public static ByteBuffer allocate(int capacity) {
    if (capacity < 0)
        throw new IllegalArgumentException();
    return new HeapByteBuffer(capacity, capacity);
}
HeapByteBuffer(int cap, int lim, boolean isReadOnly) {  
    // package-private
    super(-1, 0, lim, cap, new byte[cap], 0);
    this.isReadOnly = isReadOnly;
}
ByteBuffer(int mark, int pos, int lim, int cap, byte[] hb, int offset) {
    super(mark, pos, lim, cap, 0);
    this.hb = hb;
    this.offset = offset;
}
新生成了一个长度为capacity的数组,以及一些标示
##2.获取DirectByteBuffer对象

ByteBuffer directByteBuffer = ByteBuffer.allocateDirect(20);

源码如下:

public static ByteBuffer allocateDirect(int capacity) {

if (capacity < 0) {

throw new IllegalArgumentException("capacity < 0: " + capacity);

}

DirectByteBuffer.MemoryRef memoryRef = new DirectByteBuffer.MemoryRef(capacity);
return new DirectByteBuffer(capacity, memoryRef);

}

MemoryRef(int capacity) {

VMRuntime runtime = VMRuntime.getRuntime();

buffer = (byte[]) runtime.newNonMovableArray(byte.class, capacity + 7);

allocatedAddress = runtime.addressOf(buffer);

// Offset is set to handle the alignment: http://b/16449607

offset = (int) (((allocatedAddress + 7) & ~(long) 7) - allocatedAddress);

isAccessible = true;

}

由runtime去申请了了一块内存,不是直接在堆内存中。

再说基本操作之前,先简单说下的ByteBuffer常见的四个标示 
1. position:当前读或者写的位置 
2. mark:标记上一次mark的位置,方便reset将postion置为mark的值。 
3. limit:标记数据的最大有效的位置 
4. capacity:标记buffer的最大可存储值 
其中在任意的时候。都必须满足 
mark<=position<=limit<=capacity 
#参考
[ByteBuffer基本用法](https://blog.csdn.net/zhi184816/article/details/52462148)


目录
相关文章
|
1月前
|
缓存 Java
java文件读取 while ((len = reader.read(buffer)) != -1){}的理解
本文解释了Java中使用`InputStreamReader`和`read(buffer)`方法循环读取文件内容的机制,强调了如何正确理解读取循环和处理读取到的数据,以及如何处理字符编码和换行符。
38 0
|
3月前
|
存储 Java
如何在 Java 中写入和读取 ByteBuffer
【8月更文挑战第22天】
116 0
|
3月前
|
存储 Java
如何在 Java 中创建 ByteBuffer
【8月更文挑战第22天】
63 0
|
索引
2.3 ByteBuffer 常见方法
2.3 ByteBuffer 常见方法
65 0
|
算法 Java 索引
ByteBuffer
ByteBuffer
80 0
|
Java API 索引
ByteBuf 和 ByteBuffer 的区别, ByteBuf 动态扩容源码分析
ByteBuf 和 ByteBuffer 的区别, ByteBuf 动态扩容源码分析
551 0
|
Java 测试技术 容器
NIO 下的 ByteBuffer简单学习
NIO 下的 ByteBuffer简单学习
117 0
NIO学习二-ByteBuffer
前面我们已经了解到Buffer中,0<=mark<=postion<=limit<=capacity。其中mark是标记,如果为-1时丢弃。postion是当前位置,limit是限制,也即上界。capacity是容量。同时了解了直接缓冲区与缓冲区的底层实现是不同的,缓冲区是基于数组的,而直接缓冲区是基于内存的。同时可以基于反射,拿到cleaner,进而拿到clean进行清理。同时clear是还原缓冲区的状态,flip是反转缓冲区的,rewind重绕缓冲区,标记清除。remianing对剩余元素的个数记录。offset获取偏移量。 ByteBuffer是Buffer的子类,可以在缓冲区以字节为单
99 0
NIO学习二-ByteBuffer
|
Java
Java NIO 中的 Buffer 缓冲区详解(下)
Java NIO 中的 Buffer 缓冲区详解
190 0
Java NIO 中的 Buffer 缓冲区详解(下)
|
存储 缓存 Java
如何使用 Java 中 缓冲区类 Buffer
# 如何使用 Java 中 缓冲区类 Buffer ## 1. 什么是Buffer 缓冲区 缓冲区(Buffer):就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区 缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个数组,该对象提供了一组方法,可以更轻松地使用内存块 ## 2.Buffer及其常用子类 从 JDK1.4开始,提供使用Buffer类 ![image-20220502214516083](https://yygh-sz.oss-cn-beijing.aliyuncs.com/image-2022
149 0