Перебрать папку только один раз 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)){