code: public synchronized FileChannel newFileChannel(EffectiveOpenOptions options) throws IOException {
  		Path path = currentFilePath.get();
  
  		if (options.truncateExisting()) {
  			chunkCache.invalidateAll();
  		}
  
  		FileChannel ciphertextFileChannel = null;
  		CleartextFileChannel cleartextFileChannel = null;
  		try {
  			ciphertextFileChannel = path.getFileSystem().provider().newFileChannel(path, options.createOpenOptionsForEncryptedFile());
  			initFileSize(ciphertextFileChannel);
  			ChannelComponent channelComponent = component.newChannelComponent() //
  					.ciphertextChannel(ciphertextFileChannel) //
  					.openOptions(options) //
  					.onClose(this::channelClosed) //
  					.build();
  			cleartextFileChannel = channelComponent.channel();
  		} finally {
  			if (cleartextFileChannel == null) { // i.e. something didn't work
  				closeQuietly(ciphertextFileChannel);
  				// is this the first file channel to be opened?
  				if (openChannels.isEmpty()) {
  					close(); // then also close the file again.
  				}
  			}
  		}
  
  		assert cleartextFileChannel != null; // otherwise there would have been an exception
  		openChannels.put(cleartextFileChannel, ciphertextFileChannel);
  		chunkIO.registerChannel(ciphertextFileChannel, options.writable());
  		return cleartextFileChannel;
  	}
docs: Creates a new file channel with the given open options.
  
  @param options The options to use to open the file channel. For the most part these will be passed through to the ciphertext channel.
  @return A new file channel. Ideally used in a try-with-resource statement. If the channel is not properly closed, this OpenCryptoFile will stay open indefinite.
  @throws IOException