第三章 缓冲区(3)

来源:互联网 发布:linux 打印日志 编辑:程序博客网 时间:2024/04/30 11:38
2.1.5 翻转我们已经学会了填充buffer,现在我们准备学习从buffer中移出数据。我们想把这个buffer传递给通道channel,把内容被写到目的地去。但是如果channel调用get()方法,那么它将得到一个没有定义的数据,而不是我们刚才插入的数据。如果我们将position值设为0,那么channel就可以从正确的位置读取数据了,但是它是怎样知道我们插入数据的结尾呢?这就是limit属性被引入的目的。Limit属性确定了buffer中数据的结尾。我们需要将limit先设置为当前的position,然后再将position属性设置为0。我们手工的向下面那样做:buffer.limit(buffer.position()).position(0);设计这些API的人也希望有这样的翻转方法。因此他们设计了一个便利的方法来达到这样的目的:Buffer.flip();Flip方法将buffer从填充数据的状态改变为一种翻转为写出数据的状态。通过翻转图2.4的buffer就变成了图2.5中的样子。图2.5被翻转后的bufferRewind方法跟flip方法类似,但是rewind方法不影响limit属性。它只是将position值设置为0。你可以用rewind方法返回重新将数据读入到已经翻转的buffer中。如果你翻转buffer两次会出现什么结果?Buffer就变成了零大小。对图2.5进行跟图2.4一样的翻转操作:把limit设置为position,将position设置为0。Position和limit都变成0。尝试使用put和get方法对buffer进行操作,会分别导致BufferUnderflowException和BufferOverflowException异常。
原创粉丝点击