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; } } }
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; }