В настоящее время я пытаюсь читать строки из текстового файла, который у меня есть. Я нашел в другом stackoverflow (Чтение простого текстового файла в Java), который вы можете использовать Files.lines(..). ForEach (..) Однако я не могу понять, как использовать для каждой функции чтение строки за строкой, Кто-нибудь знает, где искать это или как это сделать?
Как читать из файлов с Files.lines(...). ForEach (...)?
Ответ 1
Пример содержимого test.txt
Hello
Stack
Over
Flow
com
Код для чтения из этого текстового файла с использованием методов lines()
и forEach()
.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class FileLambda {
public static void main(String JavaLatte[]) {
Path path = Paths.get("/root/test.txt");
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(s -> System.out.println(s));
} catch (IOException ex) {
// do something or re-throw...
}
}
}
Ответ 2
С Java 8, если файл существует в classpath
:
Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt")
.toURI())).forEach(System.out::println);
Ответ 3
Files.lines(Path)
ожидает аргумент Path
и возвращает Stream<String>
. Stream#forEach(Consumer)
ожидает аргумент Consumer
. Поэтому вызовите метод, передав ему Consumer
. Этот объект должен быть реализован, чтобы делать то, что вы хотите для каждой строки.
Это Java 8, поэтому вы можете использовать лямбда-выражения или ссылки на методы для предоставления аргумента Consumer
.
Ответ 4
Я создал образец, вы можете использовать Stream для фильтрации /
public class ReadFileLines {
public static void main(String[] args) throws IOException {
Stream<String> lines = Files.lines(Paths.get("C:/SelfStudy/Input.txt"));
// System.out.println(lines.filter(str -> str.contains("SELECT")).count());
//Stream gets closed once you have run the count method.
System.out.println(lines.parallel().filter(str -> str.contains("Delete")).count());
}
}
Пример input.txt.
SELECT Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Ответ 5
Избегайте возврата списка с:
List<String> lines = Files.readAllLines(path); //WARN
Помните, что весь файл читается при Files::readAllLines
, а результирующий массив String хранит все содержимое файла в памяти одновременно. Поэтому, если файл значительно велик, вы можете столкнуться с OutOfMemoryError
пытается загрузить все данные в память.
Вместо этого используйте stream: используйте Files.lines(Path)
который возвращает объект Stream<String>
и не страдает от этой же проблемы. Содержимое файла читается и обрабатывается лениво, что означает, что только небольшая часть файла хранится в памяти в любой момент времени.
Files.lines(path).forEach(System.out::println);