code: @Override
    public final int read(byte []buf, int offset, int length)
      throws IOException
    {
      int readOffset = _readOffset;
      int readLength = _readLength;
  
      if (readLength <= readOffset) {
        if (ZERO_COPY_SIZE <= length) {
          int len = _source.read(buf, offset, length);
          
          if (len > 0) {
            _position += len;
  
            if (_isEnableReadTime) {
              _readTime = CurrentTime.currentTime();
            }
          }
  
          return len;
        }
  
        if (! readBuffer()) {
          return -1;
        }
  
        readOffset = _readOffset;
        readLength = _readLength;
      }
  
      int sublen = Math.min(length, readLength - readOffset);
  
      System.arraycopy(_readBuffer, readOffset, buf, offset, sublen);
  
      _readOffset = readOffset + sublen;
  
      return sublen;
    }
docs: Reads into a byte array.  <code>read</code> may return less than
  the maximum bytes even if more bytes are available to read.
  
  @param buf byte array
  @param offset offset into the byte array to start reading
  @param length maximum byte allowed to read.
  
  @return number of bytes read or -1 on end of file.