如何找出存储在 ByteBuffer 中的总字节数?
How to find out total number of bytes stored in ByteBuffer?
我正在尝试提取存储在我的 ByteBuffer 中的总字节数 data_record_value
。
下面是我们如何将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]
当使用 ByteBuffer
时,在缓冲区中放入和获取值是有区别的。
当字节被放入缓冲区时,它们被添加到当前位置。如果达到限制,则缓冲区已满。因此 position()
显示缓冲区中的数据量,而 remaining()
显示缓冲区中仍可放置多少字节。我在这里假设要考虑的数据从位置 0 开始(通常情况下应该如此)。
当从缓冲区中检索到字节时,缓冲区通常是 "flipped"。这意味着位置设置为 0,限制设置为旧位置。现在 position()
返回的值显示已检索的字节数,remaining()
显示尚未检索的字节数。
在您的示例中,您返回了一个预先存在的缓冲区。数据库把数据放到这个buffer里,把position放在数据所在的位置,limit放在数据结束后的字节。所以数据库将数据放入缓冲区,然后翻转缓冲区。
如果position()
没有设置为0那么数据库可能会使用更高级的方案来缓冲数据,但是位置在数据的开始和结尾的限制仍然存在一样。
缓冲区中的数据总量因此由 ByteBuffer.remaining()
在您使用相对 get 方法从缓冲区中检索任何数据之前返回。
一旦您开始检索信息,这些信息就会丢失(尽管当然有一些方法可以找回它,例如使用 mark()
和 reset()
)。但是,如果您稍后在此过程中需要此信息,您只需将其存储在局部变量或字段中即可:
int received = buffer.remaining();
我正在尝试提取存储在我的 ByteBuffer 中的总字节数 data_record_value
。
下面是我们如何将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]
当使用 ByteBuffer
时,在缓冲区中放入和获取值是有区别的。
当字节被放入缓冲区时,它们被添加到当前位置。如果达到限制,则缓冲区已满。因此 position()
显示缓冲区中的数据量,而 remaining()
显示缓冲区中仍可放置多少字节。我在这里假设要考虑的数据从位置 0 开始(通常情况下应该如此)。
当从缓冲区中检索到字节时,缓冲区通常是 "flipped"。这意味着位置设置为 0,限制设置为旧位置。现在 position()
返回的值显示已检索的字节数,remaining()
显示尚未检索的字节数。
在您的示例中,您返回了一个预先存在的缓冲区。数据库把数据放到这个buffer里,把position放在数据所在的位置,limit放在数据结束后的字节。所以数据库将数据放入缓冲区,然后翻转缓冲区。
如果position()
没有设置为0那么数据库可能会使用更高级的方案来缓冲数据,但是位置在数据的开始和结尾的限制仍然存在一样。
缓冲区中的数据总量因此由 ByteBuffer.remaining()
在您使用相对 get 方法从缓冲区中检索任何数据之前返回。
一旦您开始检索信息,这些信息就会丢失(尽管当然有一些方法可以找回它,例如使用 mark()
和 reset()
)。但是,如果您稍后在此过程中需要此信息,您只需将其存储在局部变量或字段中即可:
int received = buffer.remaining();