Перебрать папку только один раз JAVA Files.walk

Я застрял в чтении только каталогов. Я хочу перебрать папку и просмотреть все подкаталоги, которые она содержит. Если подкаталог содержит текстовые файлы, отправьте его в класс DistributionFolder, который прочитает этот подкаталог. Сейчас читает подкаталог, например:

Можно прочитать содержимое «check», который является подкаталогом каталога «Alex» и обоих подкаталогов «check», но, к сожалению, если я добавлю еще один каталог, например:

Содержимое каталога «1111» будет прочитано дважды.

Это код, который разделяет каталог и подкаталоги:

       private boolean readingDirectory(File files, WriteDatasetInfo writeDatasetInfo) throws IOException, InterruptedException {



        List<Future> futures = new ArrayList<>();

        // is getting the number of available processes
        int nrThreads = Runtime.getRuntime().availableProcessors();

        // Creating a ExecutorService pool with the number of available processes
        ExecutorService pool = Executors.newFixedThreadPool(nrThreads);

        //Traverse the dataset using File walker

        try (Stream<Path> paths = Files.walk(Paths.get(String.valueOf(files)))){
            //filter the file to be a regular file
            paths.filter(Files ::isDirectory)
                    .filter(mainReader::isNotTheDefault)
            // for each file submit the work to the ExecutorService pool to be executed and add the videoNumber
            .forEach(
                path -> {
                    DistributionFolder distributionFolder = new DistributionFolder(this.directory,this.videoNumber);
                    try {
                        System.out.println(path);
                        this.videoNumber=distributionFolder.readingDirectory(path.toFile(),writeDatasetInfo);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                });

        }catch (Exception e){
            throw new RuntimeException(e);
        }
        finally {
            pool.shutdown();
            while (!pool.awaitTermination(24L, TimeUnit.HOURS)) {
                System.out.println("Not yet. Still waiting for termination");
            }
            Regression.FullRegression(this.directory);
            return true;
        }
    }

    private static boolean isNotTheDefault(Path path){
        if(!defaultFile.equals(path.toFile())){
            return true;
        }
        return false;
    }

Это класс DistributionFolder.

      protected final String directory;
protected int videoNumber;


public DistributionFolder(String directory,int videoNumber){
    this.directory=directory;
    this.videoNumber=videoNumber;
}


protected int readingDirectory(File files, WriteDatasetInfo writeDatasetInfo) throws IOException, InterruptedException {

    List<Future> futures = new ArrayList<>();

    // is getting the number of available processes
    int nrThreads = Runtime.getRuntime().availableProcessors();

    // Creating a ExecutorService pool with the number of available processes
    ExecutorService pool = Executors.newFixedThreadPool(nrThreads);

    //Traverse the dataset using File walker
    try (Stream<Path> paths = Files.walk(Paths.get(String.valueOf(files)))){
        //filter the file to be a regular file
        paths.filter(Files::isRegularFile)
                // apply the custom filter in order to read only txt files
                .filter(DistributionFolder::isTXT)
                // for each file submit the work to the ExecutorService pool to be executed and add the videoNumber
                .forEach(
                        path -> {

                            String[] strPath = String.valueOf(path).split("/");

                            pool.submit(new Reader(String.valueOf(path), videoNumber, this.directory, writeDatasetInfo,strPath[strPath.length-2]));
                            this.videoNumber++;

                        });

    }catch (Exception e){
        throw new RuntimeException(e);
    }
    finally {
        // wait fo the execution of the pool to be done
        pool.shutdown();
        while (!pool.awaitTermination(24L, TimeUnit.HOURS)) {
            System.out.println("Not yet. Still waiting for termination");
        }
        String[] splitFile = files.toString().split("/");

        MaintainedForRegression.SendMapForRegression(splitFile[splitFile.length-1],this.directory);
        return this.videoNumber;
    }
}

private static boolean isTXT(Path path) {
    String pathFile = String.valueOf(path);
    String[] slittedpath = pathFile.split("/");
    String[] splittedname = slittedpath[slittedpath.length - 1].split("\\.");
    return splittedname[splittedname.length - 1].equals("txt");
}

Это вывод, когда новый каталог находится внутри первого подкаталога проверочного каталога:

Это пример, который отлично работает, когда нет другого подкаталога:

Выход:

Я отредактировал вопрос, чтобы добавить больше контекста.

Моя теория такова: когда я передаю путь к каталогу в «DistributionFolder», он также перейдет в подкаталоги.

Если у вас есть какие-либо предложения, пожалуйста, дайте мне знать. Спасибо!

1 ответ

Чтобы ограничить максимальную глубину обхода, я использовал «Files.walk» со всеми тремя параметрами. Я использовал в классе «DistributionFolder» для этого блока try и catch:

       try (Stream<Path> paths = Files.walk(files.toPath(),1, FileVisitOption.FOLLOW_LINKS)){
Другие вопросы по тегам