with open("in.txt") as f:
lines = [l for l in lines if "ROW" in l]
with open("out.txt", "w") as f1:
f1.writelines(lines)
другой путь
with open("in.txt") as f, open("out.txt", "w") as f1:
for line in f:
if "ROW" in line:
f1.write(line)
EOFException является подклассом IOException. Это будет брошено, при попытке читать из потока и больше нет данных, которые будут считаны (например, потому что Ваш DataInputStream перенесен вокруг FileInputStream, и Вы пытаетесь считать больше байтов, чем оставлено в файле).
Ключевое слово неожиданно.
Если Вы используете DataInputStream и читаете 4-байтовое целое число, но было только 3 байта, остающиеся в потоке, Вы получите EOFException.
Но если Вы назовете чтение () в конце потока, то Вы просто вернетесь-1 и никакое исключение.
Ответ на другую часть вопроса: Да, EOF означает, что больше данных не будет замечено на потоке; необходимо закрыть его.