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.