code: private int read1(byte[] b, int off, int len) throws IOException {
          int avail = count - pos;
          if (avail <= 0) {
              /* If the requested length is at least as large as the buffer, and
                 if there is no mark/reset activity, do not bother to copy the
                 bytes into the local buffer.  In this way buffered streams will
                 cascade harmlessly. */
              if (len >= getBufIfOpen().length && markpos < 0) {
                  return getInIfOpen().read(b, off, len);
              }
              fill();
              avail = count - pos;
              if (avail <= 0) return -1;
          }
          int cnt = (avail < len) ? avail : len;
          System.arraycopy(getBufIfOpen(), pos, b, off, cnt);
          pos += cnt;
          return cnt;
      }
docs: Read characters into a portion of an array, reading from the underlying
  stream at most once if necessary.