code: public long skip(final long byteCount) throws IOException {
      if (byteCount <= 0) {
        return 0;
      }
      final int bSize = (int) Math.min(MAX_SKIP_BUFFER_SIZE, byteCount);
      final byte[] b = new byte[bSize];
      long skipped = 0;
      while (skipped < byteCount) {
        final int toRead = (int) Math.min(byteCount - skipped, b.length);
        final int readCount = this.read(b, 0, toRead);
        if (readCount == -1) {
          break;
        }
        skipped += readCount;
        if (readCount < toRead) {
          break;
        }
      }
      return skipped;
    }
docs: Skips at most {@code byteCount} bytes in this stream. The number of actual bytes skipped may be
  anywhere between 0 and {@code byteCount}. If {@code byteCount} is negative, this method does
  nothing and returns 0, but some subclasses may throw.
  
  <p>
  Note the "at most" in the description of this method: this method may choose to skip fewer
  bytes than requested. Callers should <i>always</i> check the return value.
  </p>
  
  <p>
  This default implementation reads bytes into a temporary buffer. Concrete subclasses should
  provide their own implementation.
  </p>
  
  @return the number of bytes actually skipped.
  @throws IOException if this stream is closed or another IOException occurs.