code: @Override
    public int read (final byte [] aBuf, final int nOfs, final int nLen)
    {
      ValueEnforcer.isArrayOfsLen (aBuf, nOfs, nLen);
  
      if (m_nPos >= m_nCount)
        return -1;
      final int nRealLen = m_nPos + nLen > m_nCount ? m_nCount - m_nPos : nLen;
      if (nRealLen <= 0)
        return 0;
      System.arraycopy (m_aBuf, m_nPos, aBuf, nOfs, nRealLen);
      m_nPos += nRealLen;
      return nRealLen;
    }
docs: Reads up to <code>len</code> bytes of data into an array of bytes from this
  input stream. If <code>pos</code> equals <code>count</code>, then
  <code>-1</code> is returned to indicate end of file. Otherwise, the number
  <code>k</code> of bytes read is equal to the smaller of <code>len</code>
  and <code>count-pos</code>. If <code>k</code> is positive, then bytes
  <code>buf[pos]</code> through <code>buf[pos+k-1]</code> are copied into
  <code>b[off]</code> through <code>b[off+k-1]</code> in the manner performed
  by <code>System.arraycopy</code>. The value <code>k</code> is added into
  <code>pos</code> and <code>k</code> is returned.
  <p>
  This <code>read</code> method cannot block.
  
  @param aBuf
  the buffer into which the data is read.
  @param nOfs
  the start offset in the destination array <code>b</code>
  @param nLen
  the maximum number of bytes read.
  @return the total number of bytes read into the buffer, or <code>-1</code>
  if there is no more data because the end of the stream has been
  reached.