package com.codecademy.eventhub.base; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; public class ByteBufferUtil { public static MappedByteBuffer createNewBuffer(String filename, int fileSize) { try (RandomAccessFile raf = new RandomAccessFile(filename, "rw")) { return raf.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, fileSize); } catch (IOException e) { throw new RuntimeException(e); } } public static MappedByteBuffer expandBuffer(String filename, MappedByteBuffer buffer, long newSize) { buffer.force(); int oldPosition = buffer.position(); try (RandomAccessFile raf = new RandomAccessFile(filename, "rw")) { raf.setLength(newSize); buffer = raf.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, raf.length()); buffer.position(oldPosition); return buffer; } catch (IOException e) { throw new RuntimeException(e); } } public static int binarySearchOffset(ByteBuffer buffer, int startOffset, int endOffset, long id, int recordSize) { if (startOffset == endOffset) { return endOffset; } int offset = (startOffset + endOffset) >>> 1; long value = buffer.getLong(offset * recordSize); if (value == id) { return offset; } else if (value < id) { return binarySearchOffset(buffer, offset + 1, endOffset, id, recordSize); } else { return binarySearchOffset(buffer, startOffset, offset, id, recordSize); } } }