code: public int read(byte b[], int off, int len) throws IOException {
          if (in == null) {
              return -1;
          } else if (b == null) {
              throw new NullPointerException();
          } else if (off < 0 || len < 0 || len > b.length - off) {
              throw new IndexOutOfBoundsException();
          } else if (len == 0) {
              return 0;
          }
          do {
              int n = in.read(b, off, len);
              if (n > 0) {
                  return n;
              }
              nextStream();
          } while (in != null);
          return -1;
      }
docs: Reads up to <code>len</code> bytes of data from this input stream
  into an array of bytes.  If <code>len</code> is not zero, the method
  blocks until at least 1 byte of input is available; otherwise, no
  bytes are read and <code>0</code> is returned.
  <p>
  The <code>read</code> method of <code>SequenceInputStream</code>
  tries to read the data from the current substream. If it fails to
  read any characters because the substream has reached the end of
  the stream, it calls the <code>close</code> method of the current
  substream and begins reading from the next substream.
  
  @param      b     the buffer into which the data is read.
  @param      off   the start offset in array <code>b</code>
  at which the data is written.
  @param      len   the maximum number of bytes read.
  @return     int   the number of bytes read.
  @exception  NullPointerException If <code>b</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>b.length - off</code>
  @exception  IOException  if an I/O error occurs.