code: public final void readFully(byte[] dst, int offset, int byteCount) throws IOException {
          Arrays.checkOffsetAndCount(dst.length, offset, byteCount);
          while (byteCount > 0) {
              int result = read(dst, offset, byteCount);
              if (result < 0) {
                  throw new EOFException();
              }
              offset += result;
              byteCount -= result;
          }
      }
docs: Reads {@code byteCount} bytes from this stream and stores them in the byte
  array {@code dst} starting at {@code offset}. If {@code byteCount} is zero, then this
  method returns without reading any bytes. Otherwise, this method blocks until
  {@code byteCount} bytes have been read. If insufficient bytes are available,
  {@code EOFException} is thrown. If an I/O error occurs, {@code IOException} is
  thrown. When an exception is thrown, some bytes may have been consumed from the stream
  and written into the array.
  
  @param dst
  the byte array into which the data is read.
  @param offset
  the offset in {@code dst} at which to store the bytes.
  @param byteCount
  the number of bytes to read.
  @throws EOFException
  if the end of the source stream is reached before enough
  bytes have been read.
  @throws IndexOutOfBoundsException
  if {@code offset < 0} or {@code byteCount < 0}, or
  {@code offset + byteCount > dst.length}.
  @throws IOException
  if a problem occurs while reading from this stream.
  @throws NullPointerException
  if {@code dst} is null.