使用Java 8并行流以并行方式读取多个文件时,请排除一些文件

时间:2019-01-25 20:08:14

标签: java multithreading java-8 parallel-processing java-stream

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

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” &&标志为true),则排除文件读取

预先感谢您的任何建议。

2 个答案:

答案 0 :(得分:2)

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) {

}

答案 1 :(得分:1)

我将使用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的表示形式