Buffers

在Vert.x中进行数据传播的大多是org.vertx.java.core.buffer.Buffer实例

Buffer表示的是一个字节序列(size >= 0), 可以向Buffer写入或者读取数据, 当写入数据时,超过其容量最大值时,会自动拓容。

Creating buffers

我们可以直接使用一系列Buffer.buffer开头的静态方法来创建一个Buffer.

Buffer可以从String或者byte arrays进行初始化,当然我们也可以直接创建出一个空Buffer.

下面给出了一些创建Buffer的示例:

创建一个内容为空的Buffer

  1. Buffer buff = Buffer.buffer();

创建一个Buffer,并使用String进行初始化,在Buffer内部该字符串会使用UTF-8进行编码

  1. Buffer buff = Buffer.buffer("some string");

创建一个Buffer,并使用String进行初始化,在Buffer内部该字符串会使用指定的编码方法进行编码

  1. Buffer buff = Buffer.buffer("some string", "UTF-16");

创建一个Buffer,并使用byte[]进行初始化

  1. byte[] bytes = new byte[] {1, 3, 5};
  2. Buffer buff = Buffer.buffer(bytes);

我们还可以在创建Buffer时指定其初始化大小。如果你能确定向Buffer写入数据的大小,那么你可以在创建Buffer指定其初始化大小。当Buffer创建成功之后,Buffer就会被分配出所指定的内存,一般来说这种方式适用于你的Buffer在不断地自动拓容的情况下。

需要注意的是,使用指定大小的方式创建一个Buffer,它本身是空的,只是分配了那么多内存而已。它并不会使用0来填充整个Buffer

  1. Buffer buff = Buffer.buffer(10000);

Writing to a Buffer

有俩种方式向Buffer中添加数据:appendingrandom access. 不管使用哪种方式,Buffer都会当容量不足时进行自动拓容。

Appending to a Buffer

Buffer提供了多种append方法,向Buffer中追加不同类型的数据。而且append方法返回的都是Buffer自身,因此我们可以使用链式调用append方法

  1. Buffer buff = Buffer.buffer();
  2. buff.appendInt(123).appendString("hello\n");
  3. socket.write(buff);

Random access buffer writes

你也可以通过一系列set方法在某个合法的索引位置上写入数据。在set方法中第一个参数是要开始写入数据的索引位置,第二个参数是要写入的数据

  1. Buffer buff = Buffer.buffer();
  2. buff.setInt(1000, 123);
  3. buff.setString(0, "hello");

Reading from a Buffer

我们通过一系列get方法从Buffer中读取数据,第一个参数是要开始读取的索引位置。

  1. Buffer buff = Buffer.buffer();
  2. for (int i = 0; i < buff.length(); i += 4) {
  3. System.out.println("int value at " + i + " is " + buff.getInt(i));
  4. }

Buffer length

使用length方法来获得Buffer的长度, length的取值方式是最大的索引值+1

Copying buffers

使用copy可以直接对Buffer进行数据拷贝

拷贝之后的俩个Buffer是否使用同一个缓冲区

Slicing buffers

我们使用slice方法创建一个sliced buffer,它与原Buffer共享一个数据缓冲区。

Buffer re-use

Buffer被写入到socket中,或者其他的一些类似的地方,他们就不能被复用了