Пример #1
0
 /**
  * 将BNode转换为byte数组
  *
  * @param bNode
  * @return
  */
 private byte[] bNodeToBytes(BNode<Integer, Long> bNode) {
   ByteDynamicArray array = new ByteDynamicArray();
   boolean isLeaf = bNode.isLeaf();
   // 是否叶节点
   array.add(isLeaf ? ADrop.TRUE_BYTE : ADrop.FALSE_BYTE);
   BNode<Integer, Long>.InnerNode[] innerNodes = bNode.getInnerNodes();
   // 关键字的数量
   array.add(ByteUtil.int2byte(bNode.getCount()));
   for (int i = 0; i < bNode.getCount(); ++i) {
     BNode<Integer, Long>.InnerNode innerNode = innerNodes[i];
     int key = innerNode.getKey();
     // 版本号
     array.add(ByteUtil.int2byte(key));
   }
   // 添加子树或者键记录的地址
   if (isLeaf) {
     for (int i = 0; i < bNode.getCount(); ++i) {
       BNode<Integer, Long>.InnerNode innerNode = innerNodes[i];
       long recordPos = innerNode.getValue();
       array.add(ByteUtil.long2byte(recordPos));
     }
   } else {
     BNode<Integer, Long>[] childNodes = bNode.getChildNodes();
     for (int i = 0; i < bNode.getCount() + 1; ++i) {
       BNode<Integer, Long> childNode = childNodes[i];
       long childPos = childNode.getPosition();
       array.add(ByteUtil.long2byte(childPos));
     }
   }
   return array.toByteArray();
 }
Пример #2
0
 @Override
 public void traverse(BNode<Integer, Long> node) {
   byte[] b = bNodeToBytes(node);
   long pos = byteDynamicArray.size() + writePos;
   byteDynamicArray.add(b);
   node.setPosition(pos);
 }
Пример #3
0
 /**
  * 将BNode存储到byte数组中
  *
  * @param node
  */
 private void storeToByteArray(BNode<Integer, Long> node) {
   node.setPosition(writePos + byteDynamicArray.size());
   byte[] b = bNodeToBytes(node);
   byteDynamicArray.add(b);
   if (!updated) {
     updated = true;
   }
 }