code: public String read(int numBytes) throws IOException {
      Preconditions.checkArgument(numBytes >= 0);
      Preconditions.checkArgument(numBytes <= MAX_ALLOWABLE_BUFFER_SIZE);
      int numBytesRemaining = numBytes;
      // first read whatever we need from our buffer
      if (!isReadBufferEmpty()) {
        int length = Math.min(end - offset, numBytesRemaining);
        copyToStrBuffer(buffer, offset, length);
        offset += length;
        numBytesRemaining -= length;
      }
  
      // next read the remaining chars directly into our strBuffer
      if (numBytesRemaining > 0) {
        readAmountToStrBuffer(numBytesRemaining);
      }
  
      if (strBufferIndex > 0 && strBuffer[strBufferIndex - 1] != LF) {
        // the last byte doesn't correspond to lf
        return readLine(false);
      }
  
      int strBufferLength = strBufferIndex;
      strBufferIndex = 0;
      return new String(strBuffer, 0, strBufferLength, charset);
    }
docs: Reads numBytes bytes, and returns the corresponding string