下面是我们如何将data_record_value表示为一个字节数组,然后从Java代码写入我们的数据库.
Offset Length (in bytes) Purpose 0 2 - clientId byte array 2 8 - value of lastModifiedDate 2+8 4 - length of avroBinaryValue array 2+8+4 Y - avroBinaryValue array
ByteBuffer data_record_value = r.getBytes("data_record_value"); // Now how do I extract total number of bytes I have stored in data_record_value?
在做了一些研究之后,我发现了多种方法来提取我的ByteBuffer data_record_value中存储的字节总数,我不确定哪一个是对的?
第一种方式是:
byte[] b = new byte[data_record_value.remaining()]; record_value.get(b); // this will be in bytes right? System.out.println("Byte Array Length: " + b.length);
第二种方式是:
int numberOfBytesInRecord = data_record_value.limit();
第三种方式是:
int numberOfBytesInRecord = data_record_value.remaining();
但是上述所有方式的数字完全不相符?我不确定应该使用哪一个?我需要提取data_record_value中存储的总字节数.
要进行交叉检查,我们可以从data_record_value ByteBuffer中提取单个字段,并计算我们存储的总字节数,并与上述任何方法进行比较.
// clientId (of two bytes by using short) short extractClientId = data_record_value.getShort(); // lastModifiedDate ( of 8 bytes which can be long ) long extractLastModifiedDate = data_record_value.getLong(); int extractAvroBinaryValueLength = data_record_value.getInt(); byte[] extractAvroBinaryValue = new byte[extractAvroBinaryValueLength]; data_record_value.get(extractAvroBinaryValue); // read attributeValue from the remaining buffer System.out.println(extractClientId); System.out.println(extractLastModifiedDate); System.out.println(new String(extractAvroBinaryValue));
更新: –
在其中一个ByteBuffer data_record_value上,这是我打印出来的 –
System.out.println("Record Value Capacity: " + data_record_value.capacity()); System.out.println("Record Value Position: " + data_record_value.position()); System.out.println("Record Value Limit: " + data_record_value.limit()); System.out.println("Record Value Remaining: " + data_record_value.remaining()); System.out.println("Record Value: " + data_record_value);
这就是打印出来的 –
Record Value Capacity: 387 Record Value Position: 185 Record Value Limit: 250 Record Value Remaining: 65 Record Value: java.nio.HeapByteBuffer[pos=185 lim=250 cap=387]
解决方法
当字节放在缓冲区上时,它们会被添加到当前位置.如果达到限制,则缓冲区已满.因此position()显示缓冲区中的数据量,而remaining()显示仍可以在缓冲区上放置多少字节.我在这里假设要考虑的数据从位置0开始(通常应该是这种情况).
当从缓冲区中检索字节时,缓冲区通常已被“翻转”.这意味着该位置设置为0,并且该限制设置为旧位置.现在,position()返回的值显示已经检索了多少字节,剩下的()显示了尚未检索的字节数.
在您的示例中,您将返回一个预先存在的缓冲区.数据库将数据放入此缓冲区,并将位置放在数据的位置,将限制放在数据结束后的字节处.因此,数据库将数据放入缓冲区,然后翻转缓冲区.
如果position()未设置为0,则数据库可以使用更高级的方案来缓冲数据,但是位置在数据的开头和最后的限制的想法保持不变.
因此,在使用相对get方法从缓冲区检索任何数据之前,ByteBuffer.remaining()将返回缓冲区中的数据总量.
一旦开始检索信息,此信息就会丢失(尽管当然有一些方法可以将其取回,例如使用mark()和reset()).如果您在此过程中稍后需要此信息,则只需将其存储在本地变量或字段中:
int received = buffer.remaining();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。