code: public long skip(long n) throws IOException {
          if (n < 0) {
              throw new IllegalArgumentException("negative skip length");
          }
          ensureOpen();
  
          // Skip bytes by repeatedly decompressing small blocks
          if (rbuf.length < 512)
              rbuf = new byte[512];
  
          int total = (int)Math.min(n, Integer.MAX_VALUE);
          long cnt = 0;
          while (total > 0) {
              // Read a small block of uncompressed bytes
              int len = read(rbuf, 0, (total <= rbuf.length ? total : rbuf.length));
  
              if (len < 0) {
                  break;
              }
              cnt += len;
              total -= len;
          }
          return cnt;
      }
docs: Skips over and discards data from the input stream.
  This method may block until the specified number of bytes are read and
  skipped. <em>Note:</em> While {@code n} is given as a {@code long},
  the maximum number of bytes which can be skipped is
  {@code Integer.MAX_VALUE}.
  
  @param n number of bytes to be skipped
  @return the actual number of bytes skipped
  @throws IOException if an I/O error occurs or if this stream is
  already closed