使用Java 8 Parallel Stream在并行读取多个文件时排除某些文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java 8 Parallel Stream在并行读取多个文件时排除某些文件相关的知识,希望对你有一定的参考价值。

我正在从文件夹中读取多个文件(大约5mb的1000个文件)。下面的代码可以正常读取,加载和存储文件的内容。

public void readAllFiles(String path) {

    try (Stream<Path> paths = Files.walk(Paths.get(path)).collect(toList()).parallelStream()) {
        paths.forEach(filePath -> {

            if (filePath.toFile().exists()) {
                String fileName = filePath.getFileName().toString();
                try {
                        List<String> loadedFile = readContent(filePath);
                        storeFiles(fileName, filePath, loadedFile);
                } catch (Exception e) {
                    LOGGER.info("ERROR WHILE READING THE CONTENT OF FILE");
                    LOGGER.error(e.getMessage());
                }
            }
        });
    } catch (IOException e) {
        LOGGER.info("ERROR WHILE READING THE FILES IN PARALLEL");
        LOGGER.error(e.getMessage());
    }
}

我的问题是在读取我想要排除某些文件的文件时,例如排除文件读取,例如条件满足(文件名包含“ABC”&& flag为true)

在此先感谢您的任何建议。

答案

Files.walk()返回Stream<Path>,因此您无需将其转换为列表。使用以下代码并行使用并根据条件对其进行过滤。

try (Stream<Path> paths = Files.walk(Paths.get(path)).parallel()
    .filter(filePath->filePath.getFileName().toString().contains("ABC"))) {
        paths.forEach(filePath -> {
            //other staff...
        });
    } catch (IOException e) {

}
另一答案

我会使用filter函数重写它:

paths.filter(e -> e.toFile().exists())              //Make sure each file exists
     .map(path -> path.getFileName().toString())    //Map it to its fileName
     .filter(file -> !file.contains("someString"))  //Filter 
     .forEach(fileName -> {                         //Rest of logic
            try { 
                    List<String> loadedFile = readContent(filePath);
                    storeFiles(fileName, filePath, loadedFile);
            } catch (Exception e) {
                LOGGER.info("ERROR WHILE READING THE CONTENT OF FILE");
                LOGGER.error(e.getMessage());
            }            
    });

在你做String之前,它将映射到forEach表示

以上是关于使用Java 8 Parallel Stream在并行读取多个文件时排除某些文件的主要内容,如果未能解决你的问题,请参考以下文章

《Java8实战》 - 读书笔记 - Parallel Stream并行流知识

stream 并行操作

是否可以在Stream.parallel()中设置线程的优先级?

Stream parallel并行流的思考

py-elasticsearch的stream_bulk、parallel_bulk、bulk性能对比

Scalaz(58)- scalaz-stream: fs2-并行运算示范,fs2 parallel processing