我目前正在尝试从一个纯文本文件中读取行。我在另一个stackoverflow(阅读Java中的纯文本文件)上发现,您可以使用Files.lines(..).forEach(..)然而,我真的不知道如何使用for each函数逐行读取文本,有人知道在哪里查找或如何查找吗?
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 args[]) {
Path path = Paths.of("/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...
}
}
}
避免返回带有:的列表
List<String> lines = Files.readAllLines(path); //WARN
请注意,当调用Files::readAllLines
时,将读取整个文件,生成的字符串数组将文件的所有内容同时存储在内存中。因此,如果文件非常大,您可能会遇到OutOfMemoryError
试图将所有文件加载到内存中。
请改用流:使用返回Stream<String>
对象的Files.lines(Path)
方法,该方法不会遇到同样的问题。文件的内容是延迟读取和处理的,这意味着在任何给定时间,只有文件的一小部分存储在内存中。
Files.lines(path).forEach(System.out::println);
使用Java 8,如果文件存在于classpath
:中
Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt")
.toURI())).forEach(System.out::println);
Files.lines(Path)
需要一个Path
参数并返回一个Stream<String>
。Stream#forEach(Consumer)
需要一个Consumer
参数。因此,调用该方法,向其传递一个Consumer
。必须实现该对象才能对每一行执行您想要的操作。
这是Java 8,因此您可以使用lambda表达式或方法引用来提供Consumer
参数。
我已经创建了一个示例,您可以使用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());
}
}
示例输入.txt.
SELECT Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing