Netty 源码分析04 Buffer01

1. 概述

一个 Buffer ,本质上是内存中的一块,我们可以将数据写入这块内存,之后从这块内存获取数据。通过将这块内存封装成 NIO Buffer 对象,并提供了一组常用的方法,方便我们对该块内存的读写。

Buffer 在 java.nio 包中实现,被定义成抽象类,从而实现一组常用的方法。整体类图如下:

Netty 源码分析04 Buffer01

  • 我们可以将 Buffer 理解为一个数组的封装,例如 IntBuffer、CharBuffer、ByteBuffer 等分别对应 int[]char[]byte[] 等。
  • MappedByteBuffer 用于实现内存映射文件,不是本文关注的重点

2. 基本属性

Buffer 中有 4 个非常重要的属性:capacitylimitpositionmark

Netty 源码分析04 Buffer01

Netty 源码分析04 Buffer01

写模式下,limit等于capacity大小

在读模式下,limit等于Buffer的实际数据大小,但是capacity还是代表buffer的最大容量

Netty 源码分析04 Buffer01

Netty 源码分析04 Buffer01

Netty 源码分析04 Buffer01

直接缓冲区的Java对象是GC管理的,对象回收时,Direct Buffer也会被释放

初始化好Direct Buffer后,就不断复用此buffer

Netty 源码分析04 Buffer01

. 向 Buffer 写入数据

每个 Buffer 实现类,都提供了 #put(...) 方法,向 Buffer 写入数据。以 ByteBuffer 举例子,代码如下:

对于 Buffer 来说,有一个非常重要的操作就是,我们要讲来自 Channel 的数据写入到 Buffer 中。在系统层面上,这个操作我们称为读操作,因为数据是从外部( 文件或者网络等 )读取到内存中。示例如下:

注意,通常在说 NIO 的读操作的时候,我们说的是从 Channel 中读数据到 Buffer 中,对应的是对 Buffer 的写入操作,初学者需要理清楚这个。

5. 从 Buffer 读取数据

每个 Buffer 实现类,都提供了 #get(...) 方法,从 Buffer 读取数据。以 ByteBuffer 举例子,代码如下:

对于 Buffer 来说,还有一个非常重要的操作就是,我们要讲来向 Channel 的写入 Buffer 中的数据。在系统层面上,这个操作我们称为写操作,因为数据是从内存中写入到外部( 文件或者网络等 )。示例如下:

Netty 源码分析04 Buffer01

Netty 源码分析04 Buffer01

Netty 源码分析04 Buffer01

Netty 源码分析04 Buffer01

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++