public synchronized String[] getOrComputeNames() {
    String[] names = this.names;
    if (names != null) {
      return names;
    }

    // read names
    // assume that file name is not greater than ~4 KiB
    byte[] tempNameBytes = new byte[4096];
    int entryCount = ikv.getEntryCount();
    names = new String[entryCount];
    short[] nameLengthInBytes = new short[entryCount];
    ByteBuffer buffer = ikv.getMappedBufferAt(nameDataPosition);
    buffer.asShortBuffer().get(nameLengthInBytes);
    buffer.position(buffer.position() + (entryCount * Short.BYTES));
    for (int i = 0; i < entryCount; i++) {
      short sizeInBytes = nameLengthInBytes[i];
      buffer.get(tempNameBytes, 0, sizeInBytes);
      names[i] = new String(tempNameBytes, 0, sizeInBytes, StandardCharsets.UTF_8);
    }

    this.names = names;
    return names;
  }
public synchronized String[] getOrComputeNames()