code: private static long _channelCopy2 (@Nonnull @WillNotClose final ReadableByteChannel aSrc,
                                       @Nonnull @WillNotClose final WritableByteChannel aDest) throws IOException
    {
      long nBytesWritten = 0;
      final ByteBuffer aBuffer = ByteBuffer.allocateDirect (16 * 1024);
      while (aSrc.read (aBuffer) != -1)
      {
        // Prepare the buffer to be drained
        aBuffer.flip ();
  
        // Make sure that the buffer was fully drained
        while (aBuffer.hasRemaining ())
          nBytesWritten += aDest.write (aBuffer);
  
        // Make the buffer empty, ready for filling
        aBuffer.clear ();
      }
      return nBytesWritten;
    }
docs: Channel copy method 2. This method performs the same copy, but assures the
  temporary buffer is empty before reading more data. This never requires
  data copying but may result in more systems calls. No post-loop cleanup is
  needed because the buffer will be empty when the loop is exited.<br>
  Source: Java NIO, page 60
  
  @param aSrc
  Source channel. May not be <code>null</code>. Is not closed after
  the operation.
  @param aDest
  Destination channel. May not be <code>null</code>. Is not closed
  after the operation.
  @return The number of bytes written.