Refactored LogReader.read method to use a java.util.function.Consumer interface.
Benefit is that it no longer reads the whole log file into memory so is suitable for working with much larger log files.
Max memory usage when processing a 1GB file is ~150MB now (down from 1.5G before).