java nio 学习2 Buffer 中 compact的作用

该方法的作用是将 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();

}

猜你喜欢

转载自blog.csdn.net/PanPa_WoNiu/article/details/103613151