Рекурсивно перечислите файлы в Java

Как я рекурсивно перечисляю все файлы в соответствии с каталогом в Java? Платформа обеспечивает какую-либо утилиту?

Я видел много hacky реализаций. Но ни один от платформы или nio

238
задан Adil 9 July 2014 в 03:09
поделиться

7 ответов

Просто напишите его, используя простую рекурсию:

public List<File> addFiles(List<File> files, File dir)
{
    if (files == null)
        files = new LinkedList<File>();

    if (!dir.isDirectory())
    {
        files.add(dir);
        return files;
    }

    for (File file : dir.listFiles())
        addFiles(files, file);
    return files;
}
12
ответ дан 23 November 2019 в 03:21
поделиться

Я бы выбрал что-то вроде этого:

public void list(File file) {
    System.out.println(file.getName());
    File[] children = file.listFiles();
    for (File child : children) {
        list(child);
    }
}

System.out.println просто указывает, что нужно что-то делать с файлом. нет необходимости различать файлы и каталоги, так как обычный файл будет просто иметь нулевые дети.

17
ответ дан 23 November 2019 в 03:21
поделиться

// Готов к запуску

import java.io.File;

public class Filewalker {

    public void walk( String path ) {

        File root = new File( path );
        File[] list = root.listFiles();

        if (list == null) return;

        for ( File f : list ) {
            if ( f.isDirectory() ) {
                walk( f.getAbsolutePath() );
                System.out.println( "Dir:" + f.getAbsoluteFile() );
            }
            else {
                System.out.println( "File:" + f.getAbsoluteFile() );
            }
        }
    }

    public static void main(String[] args) {
        Filewalker fw = new Filewalker();
        fw.walk("c:\\" );
    }

}
132
ответ дан 23 November 2019 в 03:21
поделиться

FileTils имеют ITRatefiles и ListFiles методы. Дайте им попробовать. (Из Commons-io )

Редактировать: Вы можете Проверьте здесь для эталона разных подходов. Похоже, что подход Commons-io медленный, так что выберите некоторые более быстрые отсюда (если это имеет значение)

158
ответ дан 23 November 2019 в 03:21
поделиться

Я думаю, что это должно сделать работу:

File dir = new File(dirname);
String[] files = dir.list();

Таким образом, у вас есть файлы и настройки. Теперь используйте рекурсию и сделайте то же самое для DIR ( файл класс ISDirectory () Метод).

7
ответ дан 23 November 2019 в 03:21
поделиться

Помимо рекурсивного обхода можно также использовать подход на основе Visitor.

Ниже код использует подход на основе Visitor для обхода. Ожидается, что входными данными для программы является корневой каталог для обхода.

public interface Visitor {
    void visit(DirElement d);
    void visit(FileElement f);
}

public abstract class Element {
    protected File rootPath;
    abstract void accept(Visitor v);

    @Override
    public String toString() {
        return rootPath.getAbsolutePath();
    }
}

public class FileElement extends Element {
    FileElement(final String path) {
        rootPath = new File(path);
    }

    @Override
    void accept(final Visitor v) {
        v.visit(this);
    }
}

public class DirElement extends Element implements Iterable<Element> {
    private final List<Element> elemList;
    DirElement(final String path) {
        elemList = new ArrayList<Element>();
        rootPath = new File(path);
        for (File f : rootPath.listFiles()) {
            if (f.isDirectory()) {
                elemList.add(new DirElement(f.getAbsolutePath()));
            } else if (f.isFile()) {
                elemList.add(new FileElement(f.getAbsolutePath()));
            }
        }
    }

    @Override
    void accept(final Visitor v) {
        v.visit(this);
    }

    public Iterator<Element> iterator() {
        return elemList.iterator();
    }
}

public class ElementWalker {
    private final String rootDir;
    ElementWalker(final String dir) {
        rootDir = dir;
    }

    private void traverse() {
        Element d = new DirElement(rootDir);
        d.accept(new Walker());
    }

    public static void main(final String[] args) {
        ElementWalker t = new ElementWalker("C:\\temp");
        t.traverse();
    }

    private class Walker implements Visitor {
        public void visit(final DirElement d) {
            System.out.println(d);
            for(Element e:d) {
                e.accept(this);
            }
        }

        public void visit(final FileElement f) {
            System.out.println(f);
        }
    }
}
4
ответ дан 23 November 2019 в 03:21
поделиться

Java 7 будет иметь Files.walkFileTree :

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

Теперь существует целое учебное пособие Oracle по этому вопросу .

66
ответ дан 23 November 2019 в 03:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: