In the late seventies, when available memory space was very limited and expensive, the solution to your challenge was to first read a line byte by byte up to an end marker (for example CR or CRLF) via Random Access File and then to retrieve a block from the offset value to the found end marker as block length. Then you increased the offset value by the length of the read block to read in the next block from the new offset value.
The advantage of that method is that you do not need memory-intensive string builder functionality and you also do not have to deal with the intensive and lengthy garbage routine to free up the no longer used string space in memory. Perhaps that is why the conversion could be faster than with a string builder solution.