该方法的作用是将 position 与 limit之间的数据复制到buffer的开始位置,复制后 position = limit -position,limit = capacity
但如果position 与limit 之间没有数据的话发,就不会进行复制
下面举个例子:
将数据从一个channel 读取出来,然后写入另外一个channel
ByteBuffer buffer = ByteBuffer.allocate(4);
while((len=channelSrc.read(buffer))>0) {
buffer.flip();
channelDes.write(buffer);
// 此时write并不一定一次把buffer中的数据全部发送出去,再次写数据的时候,我们
//要将 postion
System.out.println("read "+len+" bytes");
}*
如果上面写的,channel 是一种非阻塞 io 操作,write操作并不能一次将buffer 中的数据全部写入到指定的 channel 中去,但如果一次写不完的话
那么第二次再读取的时候,我们就要将 position = limit ,limit = capacity ,然后再读取,不然第二次读取的数据会把第一次没有write 完的数据覆盖掉,
等设置后第二次读取完成后,我们还是要向channel 中write 数据,然后这次写入数据还要从上一次没有写完的地方开始写,我们还要将position 还原到上一步记录的地方
然后将limit 设置成 最后一次 position 的位置,这样做在复杂,因此提供了一个 compact 操作,我们在 write 后,执行 buffer.compact()将没有发出的数据复制到 buffer
的开始位置,posittion = limit-position,limit = capacity,这样在下一次read(buffer)的时候,数据就会继续添加到缓冲的后面了
;因此标准的从一个channel 的数据到另一个 channel 的操作是这样的
while(channelread.read(buffer)>0 || buffer.position ==0){
buffer.flip();
channelwriter.write(buffer);
buffer.compact();
}