code: public int read(byte[] buf, int off, int len) throws IOException {
          ensureOpen();
          if (eos) {
              return -1;
          }
          int n = super.read(buf, off, len);
          if (n == -1) {
              if (readTrailer())
                  eos = true;
              else
                  return this.read(buf, off, len);
          } else {
              crc.update(buf, off, n);
          }
          return n;
      }
docs: Reads uncompressed data into an array of bytes. If <code>len</code> is not
  zero, the method will block until some input can be decompressed; otherwise,
  no bytes are read and <code>0</code> is returned.
  @param buf the buffer into which the data is read
  @param off the start offset in the destination array <code>b</code>
  @param len the maximum number of bytes read
  @return  the actual number of bytes read, or -1 if the end of the
  compressed input stream is reached
  
  @exception  NullPointerException If <code>buf</code> is <code>null</code>.
  @exception  IndexOutOfBoundsException If <code>off</code> is negative,
  <code>len</code> is negative, or <code>len</code> is greater than
  <code>buf.length - off</code>
  @exception ZipException if the compressed input data is corrupt.
  @exception IOException if an I/O error has occurred.