code: public BlockOutStream getOutStream(long blockId, long blockSize, WorkerNetAddress address,
        OutStreamOptions options) throws IOException {
      if (blockSize == -1) {
        try (CloseableResource<BlockMasterClient> blockMasterClientResource =
            mContext.acquireBlockMasterClientResource()) {
          blockSize = blockMasterClientResource.get().getBlockInfo(blockId).getLength();
        }
      }
      // No specified location to write to.
      if (address == null) {
        throw new ResourceExhaustedException(ExceptionMessage.NO_SPACE_FOR_BLOCK_ON_WORKER
            .getMessage(FormatUtils.getSizeFromBytes(blockSize)));
      }
      LOG.debug("Create block outstream for {} of block size {} at address {}, using options: {}",
          blockId, blockSize, address, options);
      return BlockOutStream.create(mContext, blockId, blockSize, address, options);
    }
docs: Gets a stream to write data to a block. The stream can only be backed by Alluxio storage.
  
  @param blockId the block to write
  @param blockSize the standard block size to write, or -1 if the block already exists (and this
  stream is just storing the block in Alluxio again)
  @param address the address of the worker to write the block to, fails if the worker cannot
  serve the request
  @param options the output stream options
  @return an {@link BlockOutStream} which can be used to write data to the block in a streaming
  fashion