code: @CanIgnoreReturnValue // to skip a line
    public String readLine() throws IOException {
      while (lines.peek() == null) {
        cbuf.clear();
        // The default implementation of Reader#read(CharBuffer) allocates a
        // temporary char[], so we call Reader#read(char[], int, int) instead.
        int read = (reader != null) ? reader.read(buf, 0, buf.length) : readable.read(cbuf);
        if (read == -1) {
          lineBuf.finish();
          break;
        }
        lineBuf.add(buf, 0, read);
      }
      return lines.poll();
    }
docs: Reads a line of text. A line is considered to be terminated by any one of a line feed ({@code
  '\n'}), a carriage return ({@code '\r'}), or a carriage return followed immediately by a
  linefeed ({@code "\r\n"}).
  
  @return a {@code String} containing the contents of the line, not including any
  line-termination characters, or {@code null} if the end of the stream has been reached.
  @throws IOException if an I/O error occurs