code: @Override
    public int read (@Nonnull final char [] aBuf,
                     @Nonnegative final int nOfs,
                     @Nonnegative final int nLen) throws IOException
    {
      ValueEnforcer.isArrayOfsLen (aBuf, nOfs, nLen);
      _ensureOpen ();
  
      if (nLen == 0)
        return 0;
  
      try
      {
        int nRealOfs = nOfs;
        int nRealLen = nLen;
        int nBufAvail = m_aBuf.length - m_nBufPos;
        if (nBufAvail > 0)
        {
          if (nRealLen < nBufAvail)
            nBufAvail = nRealLen;
          System.arraycopy (m_aBuf, m_nBufPos, aBuf, nRealOfs, nBufAvail);
          m_nBufPos += nBufAvail;
          nRealOfs += nBufAvail;
          nRealLen -= nBufAvail;
        }
        if (nRealLen > 0)
        {
          nRealLen = super.read (aBuf, nRealOfs, nRealLen);
          if (nRealLen == -1)
            return (nBufAvail == 0) ? -1 : nBufAvail;
          return nBufAvail + nRealLen;
        }
        return nBufAvail;
      }
      catch (final ArrayIndexOutOfBoundsException e)
      {
        throw new IndexOutOfBoundsException ();
      }
    }
docs: Reads characters into a portion of an array.
  
  @param aBuf
  Destination buffer
  @param nOfs
  Offset at which to start writing characters
  @param nLen
  Maximum number of characters to read
  @return The number of characters read, or -1 if the end of the stream has
  been reached
  @exception IOException
  If an I/O error occurs