从字节缓冲区中提取值

问题描述 投票:0回答:1

我正在尝试将值从一个字节缓冲区放到另一个字节缓冲区。假设源字节缓冲区的限制为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 ....}。

任何人都可以在这方面帮助我,如何仅将字节缓冲区中的值复制到另一个而不会获得空值的情况。即空的。

java arrays byte bytebuffer
1个回答
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的值写入缓冲区),将其清除。

这是缓冲区的流:

  • 您从位置= 0开始,限制= 20000。
  • 您将一些数据(在这种情况下为8192)读入缓冲区。在某个点上,pos = 8192,限制= 20000。
  • 您翻转:pos现在为0,限制= 8192,容量= 20000。
  • 您将所有8192读入其他内容; pos现在是8192,限制是8192,上限是20000。
  • 您清除pos现在为0,容量为20000,这是限制。
  • 再次回到开头。您可以永远这样做。
  • 因此,写入缓冲区,翻转,从中读取,清除,写入缓冲区,翻转,从中读取,清除-永远。

编辑:我错误地认为flip()也会将您从“读取模式”转换回写入模式。它并没有真正做到这一点,显然更好,更新了答案以反映这一点。

© www.soinside.com 2019 - 2024. All rights reserved.