Buffers

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

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

Creating Buffers

创建一个空Buffer

  1. Buffer buff = new Buffer();

使用String类型创建一个buffer。这个StringBuffer内部以UTF-8进行编码

  1. Buffer buff = new Buffer("some-string");

指定String编码格式创建一个Buffer实例。

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

使用byte[]创建一个Buffer

  1. byte[] bytes = new byte[] { ... };
  2. new Buffer(bytes);

在创建Buffer实例时,我们也可以指定其大小。当你确定写入buffer的数据大小时,你可以创建一个指定大小的buffer。当buffer创建成功之后,就会分配出指定大小的内存,这种方式比buffer容量不足时,自动拓容要高效的多,但是要慎用,因为它一开始就可能会非常大的内存。

注意,通过指定大小的方式创建出的Buffer实例,给它分配的内存是空的,并不会用0去填充它。

  1. Buffer buff = new Buffer(100000);

Writing to a Buffer

有俩种方式向一个buffer中写入数据:

  1. appending
  2. random access

buffer会随着写入的数据的不断增加自动拓容,因此,Buffer实例的写数据操作不可能产生IndexOutOfBoundsException异常

Appending to a Buffer

想要使用append方式向buffer中写入数据,你只需要调用appendXXX方法. Append方法支持追加buffers, byte[], String and all primitive types

appendXXX方法会返回Buffer实例自身,所以在也可以直接使用chain模式

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

你也可以通过setXXX方法在一个指定位置上写入数据。 setXXX方法支持buffers, byte[], String and all primitive types.所有的setXXX方法的第一个参数都是个写入位置的索引值。

无论采用什么写数据的方式,Buffer总会当内存不足时,进行自动拓容

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

Reading from a Buffer

我们通过getXXX方法从Buffer里读数据. getXXX方法支持byte[], String and all primitive types. getXXX方法的第一个值是开始读取的位置索引值

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

Other buffer methods:

  • length(). 获得buffer的大小。buffer的length值是buffer的最大索引值 + 1
  • copy(). 拷贝整个buffer

更多方法参考javadoc手册。