Listar arquivos em um diretório em Java

Listar arquivos em um diretório em Java

1. Visão geral

Neste tutorial rápido, veremos maneiras diferentes delist files within a directory.

2. Listagem

Se quisermos listar todos os arquivos no diretório e pular a busca em subdiretórios, podemos simplesmente usarjava.io.File#listFiles:

public Set listFilesUsingJavaIO(String dir) {
    return Stream.of(new File(dir).listFiles())
      .filter(file -> !file.isDirectory())
      .map(File::getName)
      .collect(Collectors.toSet());
}

3. DirectoryStream

[.s1] #However, Java 7 introduced a faster alternative aFile#listFiles chamadosDirectoryStream. #

Vamos ver como é o equivalente:

public Set listFilesUsingDirectoryStream(String dir) throws IOException {
    Set fileList = new HashSet<>();
    try (DirectoryStream stream = Files.newDirectoryStream(Paths.get(dir))) {
        for (Path path : stream) {
            if (!Files.isDirectory(path)) {
                fileList.add(path.getFileName()
                    .toString());
            }
        }
    }
    return fileList;
}

Podemos ver prontamente quewhile DirectoryStream may be faster, it isn’t part of the Stream APIe não é tão receptivo a trabalhar com ele.

Além disso,DirectoryStream  exige que fechemos o recurso, o que significa envolvê-lo comtry-with-resources também.

4. Caminhada

Ouwe can list all the files within a directory by walking it para umdepth configurado.

Vamos usarjava.nio.file.Files#walk para listar todos os arquivos em um diretório em uma determinada profundidade:

public Set listFilesUsingFileWalk(String dir, int depth) throws IOException {
    try (Stream stream = Files.walk(Paths.get(dir), depth)) {
        return stream
          .filter(file -> !Files.isDirectory(file))
          .map(Path::getFileName)
          .map(Path::toString)
          .collect(Collectors.toSet());
    }
}

Claro, lembre-se de usartry-with-resources para que o identificador de arquivo paradir gets feche corretamente.

Ou, se quisermos ter mais controle sobre o que acontece com cada arquivo visitado, também podemos fornecer uma implementação de visitante:

public Set listFilesUsingFileWalkAndVisitor(String dir) throws IOException {
    Set fileList = new HashSet<>();
    Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
          throws IOException {
            if (!Files.isDirectory(file)) {
                fileList.add(file.getFileName().toString());
            }
            return FileVisitResult.CONTINUE;
        }
    });
    return fileList;
}

Isso é útil quando queremos ler, mover ou excluir arquivos adicionais à medida que avançamos.

5. Conclusão

Neste tutorial rápido, exploramos diferentes maneiras de listar arquivos em um diretório.

Como sempre, o código-fonte completo dos exemplos está disponívelover on GitHub.