code: public OpenCryptoFile getOrCreate(Path ciphertextPath) {
  		Path normalizedPath = ciphertextPath.toAbsolutePath().normalize();
  		return openCryptoFiles.computeIfAbsent(normalizedPath, this::create); // computeIfAbsent is atomic, "create" is called at most once
  	}
docs: Opens a file to {@link OpenCryptoFile#newFileChannel(EffectiveOpenOptions) retrieve a FileChannel}. If this file is already opened, a shared instance is returned.
  Getting the file channel should be the next invocation, since the {@link OpenFileScoped lifecycle} of the OpenFile strictly depends on the lifecycle of the channel.
  
  @param ciphertextPath Path of the file to open
  @return The opened file.
  @see #get(Path)