code: private int _read1 (@Nonnull final byte [] aBuf,
                        @Nonnegative final int nOfs,
                        @Nonnegative final int nLen) throws IOException
    {
      int nAvail = m_nCount - m_nPos;
      if (nAvail <= 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 (nLen >= _getBufIfOpen ().length && m_nMarkPos < 0)
        {
          // Potentially blocking read
          return _getInIfOpen ().read (aBuf, nOfs, nLen);
        }
  
        _fill ();
        nAvail = m_nCount - m_nPos;
        if (nAvail <= 0)
          return -1;
      }
      final int nCnt = nAvail < nLen ? nAvail : nLen;
      System.arraycopy (_getBufIfOpen (), m_nPos, aBuf, nOfs, nCnt);
      m_nPos += nCnt;
      return nCnt;
    }
docs: Read characters into a portion of an array, reading from the underlying
  stream at most once if necessary.