Пример #1
0
  public void deleteStream(String streamName) throws IOException {
    if (raFile == null) {
      throw new IOException("MultiFile closed");
    }

    for (DirectoryBlock block : directoryBlocks) {
      Long offset = block.removeStream(streamName);
      if (offset != null) {
        block.write(raFile);

        FileBlock file = new FileBlock(offset.longValue());
        file.read(raFile);
        FreeBlock free = new FreeBlock(offset.longValue());
        free.write(raFile);
        freeBlocks.add(free);

        long next = file.getHeader().getNextBlock();
        while (next != 0) {
          file = new FileBlock(next);
          file.read(raFile);
          free = new FreeBlock(next);
          free.write(raFile);
          freeBlocks.add(free);
          next = file.getHeader().getNextBlock();
        }
        break;
      }
    }
  }
Пример #2
0
  private long createStream(String streamName) throws IOException {
    if (raFile == null) {
      throw new IOException("MultiFile closed");
    }

    deleteStream(streamName);

    FreeBlock free = (freeBlocks.isEmpty()) ? null : freeBlocks.remove(freeBlocks.size() - 1);
    long offset;
    if (free != null) {
      offset = free.getOffset();
    } else {
      offset = raFile.length();
    }

    for (DirectoryBlock block : directoryBlocks) {
      if (block.addStream(streamName, offset)) {
        block.write(raFile);
        return offset;
      }
    }

    DirectoryBlock newBlock = new DirectoryBlock(offset);
    newBlock.addStream(streamName, offset);
    newBlock.write(raFile);
    DirectoryBlock lastBlock = directoryBlocks.get(directoryBlocks.size() - 1);
    lastBlock.setNextOffset(offset);
    lastBlock.write(raFile);
    directoryBlocks.add(newBlock);

    return offset;
  }