/** * 将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(); }
@Override public void traverse(BNode<Integer, Long> node) { byte[] b = bNodeToBytes(node); long pos = byteDynamicArray.size() + writePos; byteDynamicArray.add(b); node.setPosition(pos); }
/** * 将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; } }