我正在尝试从我拥有的纯文本文件中读取行。我在另一个stackoverflow(Reading a plain text file in Java)上找到了你可以使用Files.lines(..)。forEach(..) 但是我实际上无法弄清楚如何使用for each函数逐行读取文本,任何人都知道在哪里查找或如何查找?
答案 0 :(得分:26)
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...
}
}
}
答案 1 :(得分:4)
使用 Java 8 ,如果文件存在于classpath
:
Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt")
.toURI())).forEach(System.out::println);
答案 2 :(得分:2)
Files.lines(Path)
需要Path
参数并返回Stream<String>
。 Stream#forEach(Consumer)
期望Consumer
参数。因此,调用该方法,将其传递给Consumer
。必须实现该对象以执行每行所需的操作。
这是Java 8,因此您可以使用lambda表达式或方法引用来提供Consumer
参数。
答案 3 :(得分:2)
避免返回带有以下内容的列表:
List<String> lines = Files.readAllLines(path); //WARN
请注意,在调用Files::readAllLines
时会读取整个文件,并且生成的String数组可一次将文件的所有内容存储在内存中。
因此,如果文件很大,则可能会遇到OutOfMemoryError
,试图将其全部加载到内存中。
改为使用流:使用Files.lines(Path)
方法返回一个Stream<String>
对象,并且不会遇到相同的问题。
文件的内容被懒惰地读取和处理,这意味着在任何给定时间,只有一小部分文件存储在内存中。
Files.lines(path).forEach(System.out::println);