CodeGym /Cursos /JAVA 25 SELF /Trabalhando com diretórios: criação, exclusão e visualiza...

Trabalhando com diretórios: criação, exclusão e visualização do conteúdo

JAVA 25 SELF
Nível 35 , Lição 4
Disponível

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.

1
Pesquisa/teste
Trabalho com arquivos, nível 35, lição 4
Indisponível
Trabalho com arquivos
Trabalho com arquivos
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION