我正在尝试将值从一个字节缓冲区放到另一个字节缓冲区。假设源字节缓冲区的限制为20KB,并且其中存在的值仅到8kb,例如:{1,2,3,4 ....到8kb,之后是0,0,0,0,0,.。 .till 20kb}现在,我只想将8kb值复制到目标字节缓冲区,而不是“ 0”值。
下面是尝试的代码。
ByteBuffer src = ByteBuffer.allocate(20000);
ByteBuffer dst = ByteBuffer.allocate(32000);
//Adding values to src till 8kb
byte[] b = new byte[src.position()];
src.get(b, 0, b.length); // to get the values from src byte buffer to byte array
if(dst.remaining() > b.length){
dst.put(b); // to put values got from src to dst
}
src.clear(); // to empty the src
在这种情况下,我没有得到src中字节数组中的值。我在字节数组中得到{0,0,0,0,0 ....}。
任何人都可以在这方面帮助我,如何仅将字节缓冲区中的值复制到另一个而不会获得空值的情况。即空的。
当您用价值8kb的数据填充src
时,会将8kb的位置放入20000大小的缓冲区中。
然后调用src.get(b, 0, b.length)
,该命令会尽职地将价值8kb的数据(因为b.length = 8kb)复制到b数组中... 从当前位置开始,即8kb in]。因此,它将字节[8192,16384)复制到您的字节数组中。当然,全为零。
所以,您如何解决它?
这正是flip()
缓冲区的用途:从“写入”模式切换到“读取”模式。在src获得了8kb的数据后,翻转缓冲区(此时,position()为0,而limit()现在是什么位置,即8kb),那么它将非常有用。
然后返回到开始模式(准备将价值20000的值写入缓冲区),将其清除。
这是缓冲区的流:
因此,写入缓冲区,翻转,从中读取,清除,写入缓冲区,翻转,从中读取,清除-永远。
编辑:我错误地认为flip()也会将您从“读取模式”转换回写入模式。它并没有真正做到这一点,显然更好,更新了答案以反映这一点。