我正在从文件夹读取多个文件(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),则排除文件读取
预先感谢您的任何建议。
答案 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
的表示形式