Netty 源码分析04 Buffer01
1. 概述
一个 Buffer ,本质上是内存中的一块,我们可以将数据写入这块内存,之后从这块内存获取数据。通过将这块内存封装成 NIO Buffer 对象,并提供了一组常用的方法,方便我们对该块内存的读写。
Buffer 在 java.nio
包中实现,被定义成抽象类,从而实现一组常用的方法。整体类图如下:
- 我们可以将 Buffer 理解为一个数组的封装,例如 IntBuffer、CharBuffer、ByteBuffer 等分别对应
int[]
、char[]
、byte[]
等。 - MappedByteBuffer 用于实现内存映射文件,不是本文关注的重点
2. 基本属性
Buffer 中有 4 个非常重要的属性:capacity
、limit
、position
、mark
写模式下,limit等于capacity大小
在读模式下,limit等于Buffer的实际数据大小,但是capacity还是代表buffer的最大容量
直接缓冲区的Java对象是GC管理的,对象回收时,Direct Buffer也会被释放
初始化好Direct Buffer后,就不断复用此buffer
. 向 Buffer 写入数据
每个 Buffer 实现类,都提供了 #put(...)
方法,向 Buffer 写入数据。以 ByteBuffer 举例子,代码如下:
对于 Buffer 来说,有一个非常重要的操作就是,我们要讲来自 Channel 的数据写入到 Buffer 中。在系统层面上,这个操作我们称为读操作,因为数据是从外部( 文件或者网络等 )读取到内存中。示例如下:
注意,通常在说 NIO 的读操作的时候,我们说的是从 Channel 中读数据到 Buffer 中,对应的是对 Buffer 的写入操作,初学者需要理清楚这个。
5. 从 Buffer 读取数据
每个 Buffer 实现类,都提供了 #get(...)
方法,从 Buffer 读取数据。以 ByteBuffer 举例子,代码如下:
对于 Buffer 来说,还有一个非常重要的操作就是,我们要讲来向 Channel 的写入 Buffer 中的数据。在系统层面上,这个操作我们称为写操作,因为数据是从内存中写入到外部( 文件或者网络等 )。示例如下:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++