Исключить некоторые файлы при чтении нескольких файлов параллельно, используя Java 8 Parallel Stream - PullRequest
0 голосов
/ 25 января 2019

Я читаю несколько файлов (1000 файлов размером около 5 МБ) из папки. Приведенный ниже код прекрасно работает для чтения, загрузки и хранения содержимого файла.

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

Заранее спасибо за любые предложения.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

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

}
0 голосов
/ 25 января 2019

Я бы переписал это, используя функцию 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

...