public Optional<StreamOffsetRange> findStreamOffsetRange(long streamId) {
            IndexBlockOrderedBytes indexBlockOrderedBytes = new IndexBlockOrderedBytes(this);
            int searchRst = indexBlockOrderedBytes.search(new IndexBlockOrderedBytes.TargetStreamOffset(streamId, Long.MIN_VALUE));
            int insertPoint = -searchRst - 1;
            long startOffset = Constants.NOOP_OFFSET;
            long endOffset = Constants.NOOP_OFFSET;
            for (int i = insertPoint; i < count; i++) {
                DataBlockIndex dataBlockIndex = get(i);
                if (dataBlockIndex.streamId() != streamId) {
                    break;
                }
                if (startOffset == Constants.NOOP_OFFSET) {
                    startOffset = dataBlockIndex.startOffset();
                }
                endOffset = dataBlockIndex.endOffset();
            }
            if (startOffset == Constants.NOOP_OFFSET) {
                return Optional.empty();
            } else {
                return Optional.of(new StreamOffsetRange(streamId, startOffset, endOffset));
            }
        }
@param dataBlockSize The total size of the data blocks, which equals to index start position.
@param indexBlock    raw index data.
s3stream/src/main/java/com/automq/stream/s3/ObjectReader.java