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);
}
}
}