code: @Override
  	public int read(byte[] b, int off, int len) throws IOException {
  		
  		if (len > b.length)
  			len = b.length;
  		
  		int cnt = this.available();
  		if (cnt > len)
  			cnt = len;
  		
  		if (b == null || off < 0 || len < 0 || off + len > b.length)
  			throw new EOFException("Target byte array is null or bad off or len values");
  
  		System.arraycopy(this.buffer, this.start + this.pos, b, off, cnt);
  		this.pos += cnt;
  		
  		return cnt;
  	}
docs: Fill the byte with bytes from the stream. If stream contains not enough
  data - only the part of array is filled
  
  @param b
  The byte array to be filled by data
  @param off
  Offset of byte array from which fill the array
  @param len
  Bytes count to fill
  @return Bytes count that have really read
  @throws IOException