code: final public long getByteCount() throws InterruptedException, IOException {
          try {
              return getByteCount(0L);
          } catch (AsyncTimeoutException e) {
              // Should only happen if the future itself is marked with an AsyncTimeoutException
              if ((this.exception != null)
                      && (this.exception instanceof AsyncTimeoutException)) {
                  throw (AsyncTimeoutException) this.exception;
              } // end if
                // Cannot happen since arg of 0L means wait forever
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Unexpected timeout on blocking getByteCount: "
                               + this.exception);
              }
              FFDCFilter.processException(e, getClass().getName(), "145", this);
              IOException ie = new IOException("Unexpected timeout");
              ie.initCause(e);
              throw ie;
          }
      }
docs: Returns the number of bytes read/written in the operation, or zero
  if none. If the future is completed, the call returns immediately,
  otherwise the call blocks until the operation completes.
  
  @return The number of bytes read/written in this operation.
  @throws InterruptedException
  if the calling thread was interrupted during it's
  wait for the operation to complete.
  @throws IOException
  if the operation failed
  @throws ClosedChannelException
  if the channel was closed for IO when the operation
  was attempted
  @throws AsyncTimeoutException
  if the underlying operation timed out. (Note that
  this is distinct from waiting for a limited time
  on the future to complete).