ByteBuffer笔记
# public static ByteBuffer wrap(byte[] array)
将array中的数据包装到ByteBuffer中
byte[] array = new byte[1024];
ByteBuffer buffer = ByteBuffer.wrap(array);
等效于
ByteBuffer buffer = ByteBuffer.allocate(1024); //分配一定的空间,1024
在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区.缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型.ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBuffer.因此ByteBuffer的用法是有必要牢固掌握的.
1.创建ByteBuffer
1.1 使用allocate()静态方法
ByteBuffer buffer=ByteBuffer.allocate(256);
以上方法将创建一个容量为256字节的ByteBuffer,如果发现创建的缓冲区容量太小,唯一的选择就是重新创建一个大小合适的缓冲区.
1.2 通过包装一个已有的数组来创建
如下,通过包装的方法创建的缓冲区保留了被包装数组内保存的数据.
ByteBuffer buffer=ByteBuffer.wrap(byteArray);
如果要将一个字符串存入ByteBuffer,可以如下操作:
String sendString="你好,服务器. ";
ByteBuffer sendBuffer=ByteBuffer.wrap(sendString.getBytes("UTF-16")); 1 楼 spdx4046 2012-07-27 我发现用数组和不用数组的差别很大很大哎!
比如:
ByteBuffer buffer = ByteBuffer.allocate( 100 );
ByteBuffer buffer1 = ByteBuffer.allocate(100);
ByteBuffer[] bs = new ByteBuffer[2];
bs[0] = buffer;
bs[1] = buffer1;
然后**.read(bs);
和
ByteBuffer buffer = ByteBuffer.allocate( 200 );
然后**.read(buffer)
这两者的效率是几倍的关系!
本想用ByteBuffer数组的方式 处理原本需要substring方式截取字符串解析数据的,现在不能用了!