查找模式匹配文件递归

时间:2017-10-03 19:33:47

标签: java file java-8 java-stream directory-structure

鉴于以下FileRepository类,如何在处理500个或更多客户端目录时优化文件搜索。也许我可以使用Streams重写下面的内容?

我需要查看第一级的所有客户目录,然后将foreach客户目录放在下面的级别,并且只考虑昨天的文件夹COB02Oct2010。我写了一个DateHelper给我这个前一个工作日的日期,然后只考虑相关的子目录...然后我看一下驻留在该目录中的匹配文件模式以获取文件发送。

我可以使用PathsDirectoryStream吗?

public class FileRepository {

    public List<File> getFilesToSend(String sourcePath, String pattern, String format) {

        List<File> files = new ArrayList<>();

        File[] customerDir = getCustomerDirs(sourcePath);

        for (int i = 0; i < clientDirs.length; i++) {
            files.addAll(processClientDirectory(clientDirs[i], pattern, format));
        }
        return files;
    }

    private List<File> processClientDirectory(File clientDir, String pattern, String format) {

        List<File> result = new ArrayList<>();

        pattern = pattern.toLowerCase(Locale.ENGLISH);
        format = Constants.EXTENSION_SEPARATOR + format.toLowerCase(Locale.ENGLISH); //add a "."

        File cobDir = new File(clientDir, "COB" + DateHelper.getPreviousWorkingDay());
        getFilesToProcess(result, cobDir, pattern, format);

        return result;
    }

    private void getFilesToProcess(List<File> result, File cobDir, String pattern, String format) {


        if (!cobDir.exists()) {
            return;
        }

        File[] files = cobDir.listFiles(pathName -> {
            if (pathName.isDirectory()) {
                return true;
            }

            if (!pathName.isFile()) {
                return false;
            }

            String name = pathName.getName().toLowerCase(Locale.ENGLISH);
            if (!name.startsWith(pattern)) {
                return false;
            }
            if (!name.endsWith(format)) {
                return false;
            }

            return true;
        });

        for (int i = 0; i < files.length; i++) {
            File current = files[i];
            if (current.isDirectory()) {
                getFilesToProcess(result, current, pattern, format);
                continue;
            }
            result.add(current);
        }
    }

    public File[] getCustomerDirs(String sourcePath) {
        File[] directories = new File(sourcePath).listFiles(File::isDirectory);
        return directories;
    }
}

我不知道如何编写过滤器可能就像这样:

try (DirectoryStream<Path> stream = Files.newDirectoryStream(directoryPath, filter)) {
            for (Path path : stream) {
                if (Files.isRegularFile(path)) {
                    consumer.accept(path);
                }
            }
}

1 个答案:

答案 0 :(得分:0)

以下是我的图书馆的示例解决方案:AbacusUtil

public List<File> getFilesToSend(String sourcePath, String pattern, String format) {
    final Predicate<File> isTargetFile = f -> f.isFile() 
                                && N.startsWithIgnoreCase(f.getName(), pattern) 
                                && N.endsWithIgnoreCase(f.getName(), "." + format);

    return Stream.list(new File(sourcePath))
            .filter(File::isDirectory)
            .map(f -> new File(f, "COB" + getPreviousWorkingDay()))
            .flatMap(cobDir -> Stream.list(cobDir, true).filter(isTargetFile))
            .toList();
}