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)


目录
相关文章
|
4月前
|
存储 Java
如何在 Java 中写入和读取 ByteBuffer
【8月更文挑战第22天】
141 0
|
7月前
|
存储 Java
java什么是缓冲流(Buffered Stream)?
java什么是缓冲流(Buffered Stream)?
172 0
|
索引
2.3 ByteBuffer 常见方法
2.3 ByteBuffer 常见方法
68 0
|
存储 Java Unix
Java 大小端转换(基于ByteBuffer)
Java 大小端转换(基于ByteBuffer)
583 0
|
Java API 数据处理
Java中的Stream流中的常用方法
Stream API是Java 8中引入的用于处理集合数据的强大工具,提供了丰富的方法来进行过滤、映射、排序、聚合等操作。
108 0
java Nio(二): Buffer(缓冲区)的数据存取
java Nio(二): Buffer(缓冲区)的数据存取
java Nio(二): Buffer(缓冲区)的数据存取
|
Java API 索引
ByteBuf 和 ByteBuffer 的区别, ByteBuf 动态扩容源码分析
ByteBuf 和 ByteBuffer 的区别, ByteBuf 动态扩容源码分析
577 0
|
Java
Java NIO 中的 Buffer 缓冲区详解(下)
Java NIO 中的 Buffer 缓冲区详解
200 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
157 0
|
存储 Java 容器
Java NIO 中的 Buffer 缓冲区详解(上)
Java NIO 中的 Buffer 缓冲区详解
420 0
Java NIO 中的 Buffer 缓冲区详解(上)