1. Criação de diretórios
Um diretório (também chamado de pasta) — não é apenas um contêiner para arquivos, mas a base da organização dos dados no disco. Nos aplicativos, criamos constantemente pastas para dados de entrada/saída, logs, arquivos temporários etc. A API moderna java.nio.file torna isso conveniente e multiplataforma.
Vamos ver como criar, excluir e visualizar o conteúdo das pastas usando as classes Files, Path e Paths.
Files.createDirectory(path)
Cria um único diretório no caminho especificado. Se o diretório pai não existir — será lançada uma exceção.
import java.nio.file.*;
public class DirectoryDemo {
public static void main(String[] args) throws Exception {
Path dir = Paths.get("testDir");
if (!Files.exists(dir)) {
Files.createDirectory(dir);
System.out.println("Diretório criado: " + dir.toAbsolutePath());
} else {
System.out.println("O diretório já existe: " + dir.toAbsolutePath());
}
}
}
Se você tentar criar um diretório que já existe, receberá FileAlreadyExistsException.
Files.createDirectories(path)
Cria toda a cadeia de diretórios. Se algum dos diretórios intermediários não existir — ele será criado automaticamente. Se parte da cadeia já existir — não haverá erro.
Path nestedDir = Paths.get("parent/child/grandchild");
Files.createDirectories(nestedDir);
System.out.println("Cadeia de diretórios criada: " + nestedDir.toAbsolutePath());
É como se você pedisse ao Java para construir não só a casa, mas também a entrada e a rua, caso ainda não existissem.
Exemplo típico: criando a estrutura para um projeto
Suponha que você precise salvar relatórios na pasta output/reports/2024. Não verifique cada diretório manualmente — use createDirectories.
Path reportsPath = Paths.get("output/reports/2024");
Files.createDirectories(reportsPath);
O Java descobrirá o que já existe e o que precisa ser criado.
2. Exclusão de arquivos e diretórios
Files.delete(path)
Exclui um arquivo ou um diretório vazio. Se o diretório não estiver vazio — será lançada DirectoryNotEmptyException.
Path dir = Paths.get("testDir");
try {
Files.delete(dir);
System.out.println("Diretório excluído: " + dir.toAbsolutePath());
} catch (DirectoryNotEmptyException e) {
System.out.println("Não é possível excluir: o diretório não está vazio!");
}
Files.deleteIfExists(path)
Funciona como delete, mas não lança erro se o objeto não existir. Retorna true se algo foi excluído e false — se o objeto não existia.
Path file = Paths.get("output/reports/2024/report.txt");
if (Files.deleteIfExists(file)) {
System.out.println("Arquivo excluído.");
} else {
System.out.println("Arquivo não encontrado, nada foi excluído.");
}
Como excluir um diretório não vazio?
Você não pode simplesmente excluir uma pasta não vazia. Primeiro é preciso excluir todo o seu conteúdo (arquivos e subdiretórios) e só então a própria pasta. Isso é feito de forma recursiva, por exemplo, com Files.walkFileTree:
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class DeleteDirectoryRecursively {
public static void main(String[] args) throws IOException {
Path dir = Paths.get("parent");
if (Files.exists(dir)) {
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
System.out.println("O diretório e todo o seu conteúdo foram excluídos.");
}
}
}
Se você está começando, não se assuste com esse código — mais adiante veremos o walkFileTree em detalhes.
3. Listando o conteúdo de um diretório
Files.list(path)
Retorna um Stream<Path> — um fluxo de caminhos. Você pode processar o conteúdo da pasta com a Stream API. Cada entrada — arquivo ou subdiretório (sem recursão!).
Path dir = Paths.get("output/reports");
if (Files.exists(dir) && Files.isDirectory(dir)) {
try (var stream = Files.list(dir)) {
stream.forEach(path -> System.out.println(path.getFileName()));
}
}
Detalhe importante: é obrigatório fechar o stream; por isso usamos try‑with‑resources.
Exemplo: imprimindo os nomes de arquivos e subdiretórios
Path reports2024 = Paths.get("output/reports/2024");
try (var stream = Files.list(reports2024)) {
stream.forEach(path -> {
String type = Files.isDirectory(path) ? "diretório" : "arquivo";
System.out.println(path.getFileName() + " — " + type);
});
}
Obtendo a lista de arquivos como uma coleção
List<Path> files = Files.list(reports2024)
.filter(Files::isRegularFile)
.toList();
System.out.println("Arquivos na pasta:");
files.forEach(System.out::println);
Importante: Files.list(path) retorna apenas o conteúdo do diretório atual (nível superior). Para percorrer recursivamente, use Files.walk(path).
4. Prática: mini‑gerenciador de arquivos
A utilidade cria o diretório mydata/logs, o arquivo log1.txt, imprime o conteúdo da pasta e depois apaga tudo.
import java.nio.file.*;
import java.io.IOException;
public class MiniFileManager {
public static void main(String[] args) throws IOException {
Path logsDir = Paths.get("mydata/logs");
Files.createDirectories(logsDir);
Path logFile = logsDir.resolve("log1.txt");
Files.writeString(logFile, "Olá, log!");
System.out.println("Conteúdo da pasta " + logsDir + ":");
try (var stream = Files.list(logsDir)) {
stream.forEach(path -> System.out.println(" - " + path.getFileName()));
}
Files.deleteIfExists(logFile);
Files.deleteIfExists(logsDir);
System.out.println("Arquivo e pasta excluídos.");
}
}
Comentários sobre o código:
- Files.createDirectories garante a criação de toda a cadeia.
- resolve — uma forma prática de adicionar ao caminho o nome do arquivo.
- Feche o stream de Files.list com try‑with‑resources — isso é especialmente crítico no Windows.
5. Particularidades e nuances
Verificação de existência
Antes de criar/excluir, é útil verificar se o caminho existe:
if (!Files.exists(path)) {
Files.createDirectory(path);
}
Permissões de acesso
Se o programa não tiver permissão para criar/excluir — você receberá AccessDeniedException. Por exemplo, criar uma pasta na raiz do disco como usuário comum quase sempre resultará em erro.
Diretório vazio e não vazio
Só é possível excluir um diretório vazio (Files.delete). Para excluir juntamente com todo o conteúdo, use uma travessia recursiva (walkFileTree).
Multiplataforma
A API java.nio.file funciona corretamente em todos os SOs populares e respeita os separadores de caminho. Para construir caminhos, use Paths.get e Path.resolve, e não concatene strings.
Links simbólicos
Em tarefas básicas você pode ignorá-los, mas se encontrar entradas “inusitadas” que não são nem arquivo comum nem diretório — pode ser que sejam symlinks. Voltaremos a eles em aulas avançadas.
6. Erros típicos ao trabalhar com diretórios
Erro nº 1: tentativa de excluir um diretório não vazio com uma chamada simples a Files.delete(path). O Java lançará DirectoryNotEmptyException. Primeiro exclua o conteúdo e depois a própria pasta.
Erro nº 2: esquecer de fechar o stream de Files.list(). Se você não usar try‑with‑resources, o stream ficará aberto e, no Windows, pode ocorrer erro ao excluir a pasta.
Erro nº 3: criar um diretório sem verificar a existência do pai. Chamar Files.createDirectory para um caminho do tipo parent/child, quando parent não existe, levará a NoSuchFileException. Use Files.createDirectories.
Erro nº 4: usar caminhos absolutos sem necessidade. Prefira caminhos relativos dentro do projeto — assim o código será mais portável.
Erro nº 5: não tratar IOException. Qualquer operação com o sistema de arquivos pode falhar. Envolva em try-catch ou propague a exceção.
Erro nº 6: tentar criar/excluir em uma pasta para a qual você não tem permissão. Nesse caso você receberá AccessDeniedException. Verifique o contexto de execução e as permissões de acesso.
GO TO FULL VERSION