Список всех файлов из каталога рекурсивно с Java - PullRequest
79 голосов
/ 29 марта 2010

У меня есть эта функция, которая рекурсивно печатает имена всех файлов в каталоге. Проблема в том, что мой код очень медленный, потому что он должен обращаться к удаленному сетевому устройству при каждой итерации.

Мой план - сначала рекурсивно загрузить все файлы из каталога, а затем пройти через все файлы с помощью регулярного выражения, чтобы отфильтровать все файлы, которые мне не нужны. У кого-нибудь есть лучшее предложение?

public static printFnames(String sDir){
  File[] faFiles = new File(sDir).listFiles();
  for(File file: faFiles){
    if(file.getName().matches("^(.*?)")){
      System.out.println(file.getAbsolutePath());
    }
    if(file.isDirectory()){
      printFnames(file.getAbsolutePath());
    }
  }
}

Это просто тест позже, я не собираюсь использовать подобный код, вместо этого я собираюсь добавить путь и дату модификации каждого файла, который соответствует расширенному регулярному выражению, в массив.

Ответы [ 18 ]

0 голосов
/ 17 апреля 2019

Еще один оптимизированный код

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class GetFilesRecursive {
    public static List <String> getFilesRecursively(File dir){
        List <String> ls = new ArrayList<String>();
        if (dir.isDirectory())
            for (File fObj : dir.listFiles()) {
                if(fObj.isDirectory()) {
                    ls.add(String.valueOf(fObj));
                    ls.addAll(getFilesRecursively(fObj));               
                } else {
                    ls.add(String.valueOf(fObj));       
                }
            }
        else
            ls.add(String.valueOf(dir));

        return ls;
    }

    public static void main(String[] args) {
        List <String> ls = getFilesRecursively(new File("/Users/srinivasab/Documents"));
        for (String file:ls) {
            System.out.println(file);
        }
        System.out.println(ls.size());
    }
}
0 голосов
/ 17 апреля 2019
public class GetFilesRecursive {
    public static List <String> getFilesRecursively(File dir){
        List <String> ls = new ArrayList<String>();
        for (File fObj : dir.listFiles()) {
            if(fObj.isDirectory()) {
                ls.add(String.valueOf(fObj));
                ls.addAll(getFilesRecursively(fObj));               
            } else {
                ls.add(String.valueOf(fObj));       
            }
        }

        return ls;
    }
    public static List <String> getListOfFiles(String fullPathDir) {
        List <String> ls = new ArrayList<String> ();
        File f = new File(fullPathDir);
        if (f.exists()) {
            if(f.isDirectory()) {
                ls.add(String.valueOf(f));
                ls.addAll(getFilesRecursively(f));
            }
        } else {
            ls.add(fullPathDir);
        }
        return ls;
    }

    public static void main(String[] args) {
        List <String> ls = getListOfFiles("/Users/srinivasab/Documents");
        for (String file:ls) {
            System.out.println(file);
        }
        System.out.println(ls.size());
    }
}
0 голосов
/ 29 мая 2018

Java 8

public static void main(String[] args) throws IOException {

        Path start = Paths.get("C:\\data\\");
        try (Stream<Path> stream = Files.walk(start, Integer.MAX_VALUE)) {
            List<String> collect = stream
                .map(String::valueOf)
                .sorted()
                .collect(Collectors.toList());

            collect.forEach(System.out::println);
        }


    }
0 голосов
/ 08 марта 2016

В Гуаве вам не нужно ждать возвращения Коллекции, но вы можете перебирать файлы. Легко представить интерфейс IDoSomethingWithThisFile в сигнатуре функции ниже:

public static void collectFilesInDir(File dir) {
    TreeTraverser<File> traverser = Files.fileTreeTraverser();
    FluentIterable<File> filesInPostOrder = traverser.preOrderTraversal(dir);
    for (File f: filesInPostOrder)
        System.out.printf("File: %s\n", f.getPath());
}

TreeTraverser также позволяет переключаться между различными стилями обхода.

0 голосов
/ 07 февраля 2011

Просто чтобы вы знали, что isDirectory () довольно медленный метод. Я нахожу это довольно медленно в моем файловом браузере. Я буду искать библиотеку, чтобы заменить ее собственным кодом.

0 голосов
/ 17 июля 2015
import java.io.*;

public class MultiFolderReading {

public void checkNoOfFiles (String filename) throws IOException {

    File dir=new File(filename);
    File files[]=dir.listFiles();//files array stores the list of files

 for(int i=0;i<files.length;i++)
    {
        if(files[i].isFile()) //check whether files[i] is file or directory
        {
            System.out.println("File::"+files[i].getName());
            System.out.println();

        }
        else if(files[i].isDirectory())
        {
            System.out.println("Directory::"+files[i].getName());
            System.out.println();
            checkNoOfFiles(files[i].getAbsolutePath());
        }
    }
}

public static void main(String[] args) throws IOException {

    MultiFolderReading mf=new MultiFolderReading();
    String str="E:\\file"; 
    mf.checkNoOfFiles(str);
   }
}
0 голосов
/ 29 марта 2010

такое чувство, что это глупый доступ к файловой системе и получение содержимого для каждого подкаталога вместо получения всего сразу.

Вы чувствуете, что это неправильно.Вот как работают файловые системы.Нет более быстрого способа (за исключением случаев, когда вам приходится делать это многократно или для разных шаблонов, вы можете кэшировать все пути к файлам в памяти, но затем вам приходится иметь дело с аннулированием кэша, т.е. что происходит, когда файлы добавляются / удаляются / переименовываются во времяприложение работает).

0 голосов
/ 09 декабря 2011

Более эффективный способ работы с миллионами папок и файлов состоит в том, чтобы захватить список каталогов с помощью команды DOS в каком-либо файле и проанализировать его. После анализа данных вы можете выполнять анализ и вычислять статистику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...