code: public ByteBuffer[] readBuffers(long address, int length) {
      int pageIndex = pageIndexFor(address);
      int pageAddress = pageAddressFor(address);
      int pageSize = pageSizeFor(pageIndex);
  
      if (pageAddress + length <= pageSize) {
        ByteBuffer pageBuffer = pages.get(pageIndex).asByteBuffer().duplicate();
        ByteBuffer buffer = ((ByteBuffer) pageBuffer
                .limit(pageAddress + length)
                .position(pageAddress))
                .slice().asReadOnlyBuffer();
        return new ByteBuffer[] { buffer };
      } else {
        List<ByteBuffer> buffers = new ArrayList<>(length / pageSize);
        int remaining = length;
        while (remaining > 0) {
          ByteBuffer pageBuffer = pages.get(pageIndex).asByteBuffer().duplicate();
          pageBuffer.position(pageAddress);
          if (pageBuffer.remaining() > remaining) {
            pageBuffer.limit(pageBuffer.position() + remaining);
          }
          ByteBuffer buffer = pageBuffer.slice().asReadOnlyBuffer();
          address += buffer.remaining();
          remaining -= buffer.remaining();
          buffers.add(buffer);
          pageIndex = pageIndexFor(address);
          pageAddress = pageAddressFor(address);
        }
        return buffers.toArray(EMPTY_BUFFER_ARRAY);
      }
    }
docs: Read the given range and return the data as an array of read-only {@code ByteBuffer}s.
  
  @param address address to read from
  @param length number of bytes to read
  @return an array of read-only buffers