作者在 2011-12-10 23:37:25 发布以下内容
我们可以在字节缓冲区(ByteBuffer)上创建 视图 以支持其它基本数据类型的缓冲区(Buffer)。比如,可以在ByteBuffer对象上创建一个字符型视图,在对待ByteBuffer时就好像在对待存放了字符的缓冲区一样。字符缓冲区直接支持字符串。同样地,视图的hasRemaining()方法返回的是字符数。
在处理一个已指定类型的字节缓冲区的视图时,要特别注意视图是创建在字节缓冲区的position到limit间的字节之上的。也就是说,视图的capacity大小是(limit – position),且视图的limit会根据指定类型的类型长度(如int为4字节大小)而减小,以使capacity是特定类型长度的整数倍。最后,视图和底层的ByteBuffer共享同一块存储区,任何对ByteBuffer字节数据的改变都会影响到视图,反之亦然。不过,视图的position和limit的变化并不会影响到ByteBuffer的同名属性,反之亦然。
// 创建一个ByteBuffer对象,capacity=15
ByteBuffer buf = ByteBuffer.allocate(15);
// remaining = 15
// 在buf上创建字符视图
CharBuffer cbuf = buf.asCharBuffer();
// remaining = 7
// 短整型视图
ShortBuffer sbuf = buf.asShortBuffer();
// remaining = 7
// 整型视图
IntBuffer ibuf = buf.asIntBuffer();
// remaining = 3
//长整型视图
LongBuffer lbuf = buf.asLongBuffer();
// remaining = 1
// 单精度浮点型
FloatBuffer fbuf = buf.asFloatBuffer();
// remaining = 3
// 双精度浮点型
DoubleBuffer dbuf = buf.asDoubleBuffer();
// remaining = 1
下面是视图cbuf的实验和结果:ByteBuffer buf = ByteBuffer.allocate(15);
// remaining = 15
// 在buf上创建字符视图
CharBuffer cbuf = buf.asCharBuffer();
// remaining = 7
// 短整型视图
ShortBuffer sbuf = buf.asShortBuffer();
// remaining = 7
// 整型视图
IntBuffer ibuf = buf.asIntBuffer();
// remaining = 3
//长整型视图
LongBuffer lbuf = buf.asLongBuffer();
// remaining = 1
// 单精度浮点型
FloatBuffer fbuf = buf.asFloatBuffer();
// remaining = 3
// 双精度浮点型
DoubleBuffer dbuf = buf.asDoubleBuffer();
// remaining = 1
System.out.println(cbuf.position());//0
System.out.println(cbuf.limit());//7
System.out.println(cbuf.remaining());//7
System.out.println(cbuf.capacity());//7
System.out.println(cbuf.limit());//7
System.out.println(cbuf.remaining());//7
System.out.println(cbuf.capacity());//7