缓存器
在Vert.x中大多数数据会转换成缓存器。一个缓存器是零个或多个字节的序列,这个序可以被读写,并且在需要的时候自动扩展容纳写入的字节。可以将缓存器想象成一个智能字节数组。
创建缓存器
使用其中之一Buffer.buffer静态方法创建缓存器。缓存器可以以字符串,字节数组初始化,或创建空缓存器。
下面有一些创建缓存器的例子:
创一个空缓存器的例子:
Bufferbuff = Buffer.buffer();
从字符串创建缓存器。字符将使用UTF-8编码进缓存器。
Bufferbuff = Buffer.buffer("some string");
从字符串创建缓存器:字符串可以使用指定的编码方式编码进缓存器,例如:
Bufferbuff = Buffer.buffer("some string", "UTF-16");
从字节数组创建缓存器:
byte[]bytes = new byte[] {1, 3, 5};
Bufferbuff = Buffer.buffer(bytes);
创建一个初始始大小的缓存器。如知道写入数据的特定数量,则可以创建指定大小的缓存器。这使得缓存器在初始化时定位足够的内存空间,这比缓存器被写入时自动多次扩展空间要有效得多。注意,这种方式创建的缓存器是空的,Vert.x创建填充值为零的到指定大小的缓存器。
Bufferbuff = Buffer.buffer(10000);
向缓存器写
有两个方 法向缓存器写:appending,和随机访问。这两种情况缓存器总是自动扩展和压缩字节。这样就不会得到IndexOutOfBoundsException异常。
向缓存器追加
为了几缓存器追加数以后在,可以调用以append开头的方法。Append开头的方法可向缓存器中追加不同类型数据。Append开头的方法返加缓存器自身,所以可以链式调用:
Bufferbuff = Buffer.buffer();
buff.appendInt(123).appendString("hello\n");
socket.write(buff);
随机访问缓存器写入
通过使用setXXX类似方法,可以在指定的索引位置向缓存器写入。存在不同类型的set方法。所有set方法的第一个参数都是索引,索引代表在缓存器中的开始写数据的位置。只要需要缓存器总是自动扩展以容纳数据。
Bufferbuff = Buffer.buffer();
buff.setInt(1000,123);
buff.setString(0,"hello");
从缓存器中读取数据
使用getXXX方法从缓存器中读取数据。有多种数据类型的Get方法。Get方法的第一个参数是从缓存器中获取数据的索引值。
Bufferbuff = Buffer.buffer();
for (inti = 0; i < buff.length(); i += 4) {
System.out.println("int value at "+ i + " is " + buff.getInt(i));
}
与无符号数字工作
无符号数值可能通过getUnsignedXX,appendUnsignedXX,setUnsignedXXX方法读取,追加和设置。这在实现优化消费带宽网络协议的编解码器是有用的。在下面的例子中,值200的一个字节将被设置到指定置:
Bufferbuff = Buffer.buffer(128);
int pos =15;
buff.setUnsignedByte(pos,(short) 200);
System.out.println(buff.getUnsignedByte(pos));
终端显示’200’.
缓存器长度
调用length方法获取缓存器的长度。缓存的长度是缓存器的最大索引加一。
复制缓存器
调用copy方法进行缓存器复制。
缓存器切片
一个切片缓存器是源缓存器的一个新缓存器,例如copy方法不复制底层数据。使用slice方法创建一个切片缓存器。
缓存器重用
针对一个Socket编写的缓存器,在差不多相同的地方可以重用