Когда вы говорите эффективный , вы обычно должны решить, какое направление вы имеете в виду: должно ли оно работать быстро или использовать как можно меньше ресурсов (памяти, ...). Часто оба лежат на противоположных сайтах, и вы должны выбрать компромисс.
Если вы хотите осуществлять поиск, ориентированный на память, я бы посоветовал читать файл построчно, а не читать его сразу, что, как я подозреваю, происходит (я был бы неправ, но в других языках что-то вроде readLines читает весь файл в массив строк).
Если вы хотите, чтобы он работал быстро, я бы предложил, как уже упоминалось, прочитать сразу весь файл и найти заданный шаблон. Вместо того, чтобы просто проверять содержимое, вы можете использовать indexOf, чтобы получить позицию, а затем прочитать запись по мере необходимости из этой позиции.