code: public static long copy(ReadableByteChannel in, WritableByteChannel out, int bufferSize, StreamProgress streamProgress) throws IORuntimeException {
  		Assert.notNull(in, "InputStream is null !");
  		Assert.notNull(out, "OutputStream is null !");
  
  		ByteBuffer byteBuffer = ByteBuffer.allocate(bufferSize <= 0 ? DEFAULT_BUFFER_SIZE : bufferSize);
  		long size = 0;
  		if (null != streamProgress) {
  			streamProgress.start();
  		}
  		try {
  			while (in.read(byteBuffer) != EOF) {
  				byteBuffer.flip();// 写转读
  				size += out.write(byteBuffer);
  				byteBuffer.clear();
  				if (null != streamProgress) {
  					streamProgress.progress(size);
  				}
  			}
  		} catch (IOException e) {
  			throw new IORuntimeException(e);
  		}
  		if (null != streamProgress) {
  			streamProgress.finish();
  		}
  
  		return size;
  	}
docs: 拷贝流，使用NIO，不会关闭流
  
  @param in {@link ReadableByteChannel}
  @param out {@link WritableByteChannel}
  @param bufferSize 缓冲大小，如果小于等于0，使用默认
  @param streamProgress {@link StreamProgress}进度处理器
  @return 拷贝的字节数
  @throws IORuntimeException IO异常