繁体   English   中英

如何使用 Streams 从目录中逐行读取所有文件?

[英]How can I read all files line by line from a directory by using Streams?

我有一个名为 Files 的目录,它有很多文件。我想逐行读取这些文件并将它们存储为List<List<String>>

./Files
 ../1.txt
 ../2.txt
 ../3.txt
 ..
 ..

事情就是这样。

private List<List<String>> records = new ArrayList<>();

List<Path> filesInFolder = Files.list(Paths.get("input"))
                .filter(Files::isRegularFile)
                .collect(Collectors.toList());

records = Files.lines(Paths.get("input/1.txt"))
                .map(row -> Arrays.asList(row.split(space)))
                .collect(Collectors.toList());

逻辑基本上是这样的

List<List<String>> records = Files.list(Paths.get("input"))
    .filter(Files::isRegularFile)
    .flatMap(path -> Files.lines(path)
        .map(row -> Arrays.asList(row.split(" "))))
    .collect(Collectors.toList());

但是您需要捕获Files.lines可能引发的IOException 此外,Files.list 返回的Files.list应关闭以尽快释放相关资源。

List<List<String>> records; // don't pre-initialize
try(Stream<Path> files = Files.list(Paths.get("input"))) {
    records = files.filter(Files::isRegularFile)
        .flatMap(path -> {
            try {
                return Files.lines(path)
                    .map(row -> Arrays.asList(row.split(" ")));
            } catch (IOException ex) { throw new UncheckedIOException(ex); }
        })
        .collect(Collectors.toList());
}
catch(IOException|UncheckedIOException ex) {
    // log the error

    // and if you want a fall-back:
    records = Collections.emptyList();
}

请注意,与flatMap一起使用的Files.lines返回的流会自动正确关闭, 如文档所示:

每个映射的 stream 在其内容已放入此 stream 后关闭。


也可以将map步骤从内部 stream 移到外部:

List<List<String>> records; // don't pre-initialize
try(Stream<Path> files = Files.list(Paths.get("E:\\projects\\nbMJ\\src\\sub"))) {
    records = files.filter(Files::isRegularFile)
        .flatMap(path -> {
            try { return Files.lines(path); }
            catch (IOException ex) { throw new UncheckedIOException(ex); }
        })
        .map(row -> Arrays.asList(row.split(" ")))
        .collect(Collectors.toList());
}
catch(IOException|UncheckedIOException ex) {
    // log the error

    // and if you want a fall-back:
    records = Collections.emptyList();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM