5.4.4 准备Buffer:clear()、flip()和rewind()
在使用缓冲区进行输入输出数据之前,必须确定缓冲区的position,limit都已经设置了正确的值。下面考虑一个容量为7的CharBuffer实例,并已经连续调用了put()或read()方法:
如果现在想用这个缓冲区进行信道的写操作,由于write()方法将从position指示的位置开始读取数据,在limit指示的位置停止,因此在进行写操作前,先要将limit的值设为position的当前值,再将position的值设为0。
这种情况我们可以自己处理,不过,幸运的是,Java已经提供了一些便利的方法来完成这些工作,见表5-3。
注意,这些方法不会改变缓冲区中的数据,只是改变缓冲区的索引。clear()方法将position设置为0,并将limit设置为等于capacity,从而使缓冲区准备好从缓冲区的put操作或信道的读操作接收新的数据。
后续的put()/read()调用,将数据从第一个元素开始填入缓冲区,直到填满了limit所指定的限制,其值等于capacity的值。
虽然名字是clear(),但它实际上不会改变缓冲区中的数据,而只是简单地重置了缓冲区的主要索引值。考虑一个最近使用put()或read()存入了数据的缓冲区,其position值指示了不包含有效字符的第一个元素位置。
flip()方法用来将缓冲区准备为数据传出状态,这通过将limit设置为position的当前值,再将position的值设为0来实现:
后续的get()/write()调用将从缓冲区的第一个元素开始检索数据,直到到达limit指示的位置。下面是使用flip()方法的例子:
假设在写出缓冲区的所有数据后,你想回到缓冲区的开始位置再重写一次相同的数据(例如,想要将同样的数据发送给另一个信道)。rewind()方法将position设置为0,并使mark值无效。这很像flip()方法的操作,只是limit的值没变。这些操作什么时候会有用呢?当你想要将在网络上发送的所有数据都写入日志时就会用到: