Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Мораль: если у вас современная Java — надо делать хорошо, и не надо плохо.

Если бы только это…
Stream, который тут неявно создаётся, должен быть закрыт вызовом метода close() (от чего, конечно, спасёт try-with-resources, но ещё удобнее Lombok`овская аннотация @Cleanup)
Кроме того, вариант для Java 8 плох тем, что часто у нас нет абсолютного пути файла, только его имя и уверенность, что он лежит где-то в CLASSPATH (так бывает, если он в папке "src/main/resources" или для тестов — "src/test/resources" — в Maven-Gradle проектной структуре), так что гораздо удобнее использовать для поиска ClassLoader.
В общем, у меня получилось так (Java 8+ и не забываем подключить в проект Lombok):
class MyClass {
@SneakyThrows
public static void doWithFileLines(String fileName, Consumer<String> stringConsumer) {
@Cleanup
BufferedReader reader = new BufferedReader(
new InputStreamReader(
MyClass.class.getResourceAsStream(fileName), UTF_8));
String line;
while ((line = reader.readLine()) != null)
stringConsumer.accept(line);
}
// Файл с таким именем должен лежать в ./src/test/resources в проекте
static final String FILE_NAME = "/text.txt";
// Дёргаем так:
@Test
@DisplayName("doWithFileLines method works correctly")
void testDoWithFileLines() {
doWithFileLines(FILE_NAME, line -> {
// Здесь пишем, что надо делать с каждой строчкой,
// например что бы вывести на консоль:
System.out.println(line);
});
}
}@SneakyThrows
public Optional<String> getFileAsString(String fileName) {
val path = String.format("/%s", fileName);
return Optional.ofNullable(getClass().getResource(path))
.map(URL::getFile)
.map(Paths::get)
.map(CheckedFunction1.<Path, String>narrow(Files::readString)
.recover(throwable -> null));
}
Эволюция Java на примере чтения строк из файла