code: @Override
    public FileChannel newFileChannel(
        Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs) throws IOException {
      checkNotNull(path);
      initStorage();
      CloudStorageUtil.checkNotNullArray(attrs);
      if (options.contains(StandardOpenOption.CREATE_NEW)) {
        Files.createFile(path, attrs);
      } else if (options.contains(StandardOpenOption.CREATE) && !Files.exists(path)) {
        Files.createFile(path, attrs);
      }
      if (options.contains(StandardOpenOption.WRITE)
          || options.contains(StandardOpenOption.CREATE)
          || options.contains(StandardOpenOption.CREATE_NEW)
          || options.contains(StandardOpenOption.TRUNCATE_EXISTING)) {
        return new CloudStorageWriteFileChannel(newWriteChannel(path, options));
      } else {
        return new CloudStorageReadFileChannel(newReadChannel(path, options));
      }
    }
docs: Open a file for reading OR writing. The {@link FileChannel} that is returned will only allow
  reads or writes depending on the {@link OpenOption}s that are specified. If any of the
  following have been specified, the {@link FileChannel} will be write-only: {@link
  StandardOpenOption#CREATE}
  
  <ul>
  <li>{@link StandardOpenOption#CREATE}
  <li>{@link StandardOpenOption#CREATE_NEW}
  <li>{@link StandardOpenOption#WRITE}
  <li>{@link StandardOpenOption#TRUNCATE_EXISTING}
  </ul>
  
  In all other cases the {@link FileChannel} will be read-only.
  
  @param path The path to the file to open or create
  @param options The options specifying how the file should be opened, and whether the {@link
  FileChannel} should be read-only or write-only.
  @param attrs (not supported, the values will be ignored)
  @throws IOException