Home / Programmazione / Java / Listare file ricorsivamente con Java NIO
Mattepuffo

Listare file ricorsivamente con Java NIO

Listare file ricorsivamente con Java NIO

Articolo riscritto.

In questo articolo avevo già parlato di come listare file ricorsivamente usando Java.

Oggi vediamo come eseguire la stessa operazione usando il package NIO.

Non è strettamente necessario, ma è tendenzialmente milgiore da un punto di vista delle performance in caso di molti file e directory (e richiede anche meno codice).

Nel caso in questione, prenderemo in esame una List di File; alla lista verranno aggiunti solo i file e non le directory.

Ecco il metodo:

    public List scanDir(Path directory) throws IOException {
        List list = new ArrayList<>();
        Files.walkFileTree(directory, new FileVisitor() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                File f = file.toFile();
                if (f.isFile()) {
                    list.add(f);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult preVisitDirectory(Path t, BasicFileAttributes bfa) throws IOException {
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path t, IOException ioe) throws IOException {
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path t, IOException ioe) throws IOException {
                return FileVisitResult.CONTINUE;
            }
        });
        return list;
    }

Al metodo passiamo il Path da cui cominciare a scansionare.

Usiamo il metodo walkFileTree di java.nio.file.Files.

Usiamo il costruttore con FileVisitor; questo mi bypassa anche la problematica che ho descritto qua.

Il metodo farà tutto da solo, nel senso che ci penserà lui a "camminare" per le varie sottodirectory.

Enjoy!