Stream a large text file line by line

Java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;

/** Reads a large text file lazily instead of loading it into memory. */
public final class LineScanner {

    private LineScanner() {
    }

    /** Caller closes the returned stream; closing it closes the file. */
    public static Stream<String> matchingLines(Path path, String needle) throws IOException {
        return Files.lines(path).filter(line -> line.contains(needle));
    }

    public static void main(String[] args) throws IOException {
        Path log = Files.createTempFile("scanner", ".log");
        Files.writeString(log, "INFO ready\nERROR disk full\nERROR timeout\n");

        try (Stream<String> lines = matchingLines(log, "ERROR")) {
            System.out.println("error lines: " + lines.count()); // 2
        } finally {
            Files.deleteIfExists(log);
        }
    }
}