code: private int _internalRead (final char [] aBuf, final int nOfs, final int nLen) throws IOException
    {
      if (m_nNextCharIndex >= m_nChars)
      {
        /*
         * If the requested length is at least as large as the buffer, and if
         * there is no mark/reset activity, and if line feeds are not being
         * skipped, do not bother to copy the characters into the local buffer. In
         * this way buffered streams will cascade harmlessly.
         */
        if (nLen >= m_aBuf.length && m_nMarkedChar <= UNMARKED && !m_bSkipLF)
          return m_aReader.read (aBuf, nOfs, nLen);
        _fill ();
      }
      if (m_nNextCharIndex >= m_nChars)
        return -1;
      if (m_bSkipLF)
      {
        m_bSkipLF = false;
        if (m_aBuf[m_nNextCharIndex] == '\n')
        {
          m_nNextCharIndex++;
          if (m_nNextCharIndex >= m_nChars)
            _fill ();
          if (m_nNextCharIndex >= m_nChars)
            return -1;
        }
      }
      final int nBytesRead = Math.min (nLen, m_nChars - m_nNextCharIndex);
      System.arraycopy (m_aBuf, m_nNextCharIndex, aBuf, nOfs, nBytesRead);
      m_nNextCharIndex += nBytesRead;
      return nBytesRead;
    }
docs: Reads characters into a portion of an array, reading from the underlying
  stream if necessary.
  
  @param aBuf
  The buffer to be filled
  @param nOfs
  The offset to start reading
  @param nLen
  The number of bytes to read
  @return The number of bytes read
  @throws IOException
  in case reading fails