CodeGym /Cursos /JAVA 25 SELF /Classes File, Path, Files: visão geral, criação de objeto...

Classes File, Path, Files: visão geral, criação de objetos

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

1. Classe File: como tudo começou

Embora já tenhamos concluído que a classe File é melhor não usar em novos projetos, existem muitos sistemas legados em que ela é aplicada. Portanto, é importante entendê-la e saber utilizá-la. A classe File é uma forma antiga de representar um arquivo ou diretório no disco. Mas não confunda: o objeto File não é o arquivo em si, é apenas um “ponteiro”/descritor de caminho. Por exemplo, a expressão File f = new File("hello.txt"); não cria um arquivo no disco — você apenas descreveu o caminho.

Como criar um objeto File?

import java.io.File;

public class FileDemo {
    public static void main(String[] args) {
        File file = new File("example.txt"); // caminho relativo
        File folder = new File("mydir");     // diretório

        System.out.println("Caminho absoluto: " + file.getAbsolutePath());
        System.out.println("O arquivo existe? " + file.exists());
        System.out.println("É um arquivo? " + file.isFile());
        System.out.println("É um diretório? " + folder.isDirectory());
    }
}

O que é importante lembrar:
Criar um objeto File não cria um arquivo no disco. É apenas um “atalho”. Para o arquivo realmente aparecer, é preciso criar explicitamente (por exemplo, gravar dados ou chamar file.createNewFile()).

Métodos principais da classe File

  • exists() — verifica se o arquivo/diretório existe.
  • isFile() — é um arquivo (e não uma pasta)?
  • isDirectory() — é um diretório?
  • getAbsolutePath() — obter o caminho absoluto.
  • length() — tamanho do arquivo em bytes.
  • getName() — nome do arquivo ou pasta.
  • delete() — excluir arquivo/diretório (se estiver vazio).

Exemplo: exibindo informações do arquivo

File file = new File("example.txt");
System.out.println("Nome: " + file.getName());
System.out.println("Caminho: " + file.getAbsolutePath());
System.out.println("Tamanho: " + file.length() + " bytes");
System.out.println("Existe? " + file.exists());

2. Classe Path: uma visão moderna de arquivos

Path é parte da nova API de arquivos (NIO.2, desde o Java 7). É uma abstração do caminho para um arquivo/diretório, e o caminho pode estar não apenas no disco local, mas também, por exemplo, dentro de um arquivo ZIP ou em um recurso remoto (se houver um provedor correspondente).

Se File é um mapa de papel antigo, então Path é um GPS.

Como criar um objeto Path?

import java.nio.file.Path;
import java.nio.file.Paths;

public class PathDemo {
    public static void main(String[] args) {
        Path path1 = Paths.get("example.txt"); // caminho relativo
        Path path2 = Paths.get("folder", "file.txt"); // juntando partes do caminho

        System.out.println("Caminho 1: " + path1.toAbsolutePath());
        System.out.println("Caminho 2: " + path2.toAbsolutePath());
    }
}

Vantagem: você não precisa se preocupar com separadores. Paths.get escolherá o formato correto para o seu SO.

Conversão entre File e Path

  • FilePath: file.toPath()
  • PathFile: path.toFile()
File file = new File("test.txt");
Path path = file.toPath();

Path anotherPath = Paths.get("data.txt");
File anotherFile = anotherPath.toFile();

Trabalhando com caminhos: resolve, relativize, normalize

Juntando caminhos (resolve)

Path dir = Paths.get("myfolder");
Path file = dir.resolve("notes.txt"); // myfolder/notes.txt
System.out.println(file); // myfolder/notes.txt

Caminho relativo (relativize)

Path pathA = Paths.get("folderA/file1.txt");
Path pathB = Paths.get("folderA/subfolder/file2.txt");
Path relative = pathA.relativize(pathB);
System.out.println(relative); // ../subfolder/file2.txt

Normalização do caminho (normalize)

Path messy = Paths.get("folder/../folder/file.txt");
Path clean = messy.normalize();
System.out.println(clean); // folder/file.txt

Exemplo: construindo o caminho para um arquivo

Path home = Paths.get(System.getProperty("user.home"));
Path docs = home.resolve("Documents");
Path myFile = docs.resolve("myfile.txt");
System.out.println("Caminho para o arquivo: " + myFile.toAbsolutePath());

3. Classe Files: seu canivete suíço

A classe Files do pacote java.nio.file é um conjunto utilitário de métodos estáticos para trabalhar com arquivos e diretórios sobre Path. Ela faz praticamente tudo: verificar existência, criar/excluir, ler/gravar, copiar/mover, obter atributos e percorrer a árvore de diretórios.

Métodos principais da classe Files

  • Files.exists(path) — verifica se o arquivo/diretório existe.
  • Files.isDirectory(path) — é um diretório?
  • Files.size(path) — tamanho do arquivo.
  • Files.createFile(path) — criar arquivo.
  • Files.createDirectory(path) — criar diretório.
  • Files.delete(path) — excluir arquivo/diretório.
  • Files.copy(src, dest) — copiar arquivo.
  • Files.move(src, dest) — mover/renomear.
  • Files.getLastModifiedTime(path) — hora da última modificação.
  • Files.readAllBytes(path) — ler o arquivo inteiro como array de bytes.
  • Files.readAllLines(path) — ler todas as linhas de um arquivo de texto.
  • Files.write(path, bytes) — gravar bytes em um arquivo.

Exemplo: verificando arquivo

import java.nio.file.*;

public class FilesDemo {
    public static void main(String[] args) {
        Path path = Paths.get("example.txt");

        System.out.println("O arquivo existe? " + Files.exists(path));
        System.out.println("É um diretório? " + Files.isDirectory(path));

        if (Files.exists(path)) {
            try {
                System.out.println("Tamanho do arquivo: " + Files.size(path) + " bytes");
            } catch (Exception e) {
                System.out.println("Erro ao obter o tamanho: " + e.getMessage());
            }
        }
    }
}

4. Prática: criando objetos e exibindo propriedades

Criando objetos para arquivo e diretório

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

public class CompareDemo {
    public static void main(String[] args) {
        // Maneira antiga
        File oldFile = new File("test.txt");
        File oldDir = new File("mydir");

        // Maneira nova
        Path newFile = Paths.get("test.txt");
        Path newDir = Paths.get("mydir");

        System.out.println("=== File API ===");
        System.out.println("Arquivo: " + oldFile.getAbsolutePath());
        System.out.println("Existe? " + oldFile.exists());
        System.out.println("É um arquivo? " + oldFile.isFile());
        System.out.println("É um diretório? " + oldDir.isDirectory());

        System.out.println("\n=== Path API ===");
        System.out.println("Arquivo: " + newFile.toAbsolutePath());
        System.out.println("Existe? " + java.nio.file.Files.exists(newFile));
        System.out.println("É um arquivo? " + java.nio.file.Files.isRegularFile(newFile));
        System.out.println("É um diretório? " + java.nio.file.Files.isDirectory(newDir));
    }
}

Exibindo propriedades do arquivo

import java.nio.file.*;

public class FileProperties {
    public static void main(String[] args) {
        Path path = Paths.get("test.txt");

        System.out.println("Caminho absoluto: " + path.toAbsolutePath());
        System.out.println("Nome do arquivo: " + path.getFileName());
        System.out.println("Diretório pai: " + path.getParent());

        if (Files.exists(path)) {
            try {
                System.out.println("Tamanho: " + Files.size(path) + " bytes");
                System.out.println("Última modificação: " + Files.getLastModifiedTime(path));
            } catch (Exception e) {
                System.out.println("Erro ao obter as informações: " + e.getMessage());
            }
        } else {
            System.out.println("Arquivo não encontrado.");
        }
    }
}

5. Comparação: File vs Path/Files

Recurso File (java.io) Path + Files (java.nio.file)
Representação do caminho Apenas disco local Disco local, ZIP, recursos de rede
Junção de caminhos Junção manual com barras Prático via resolve
Verificação de existência exists() Files.exists(path)
Leitura/gravação de conteúdo Não Sim (Files.readAll..., Files.write)
Obtenção de atributos Básicos (length(), lastModified()) Atributos e visualizações avançados
Compatibilidade Com todas as versões do Java Java 7 e superiores
Trabalho com links simbólicos Limitado Suporte completo

Resumo: quando usar o quê?

  • Para novos projetos — use Path e Files.
  • Para manter código legado — às vezes será necessário trabalhar com File.

6. Nuances úteis

Caminhos relativos e absolutos

Um caminho relativo é relativo ao diretório de trabalho atual; o absoluto é o caminho completo a partir da raiz do sistema de arquivos.

Path relative = Paths.get("data", "file.txt");
Path absolute = relative.toAbsolutePath();
System.out.println("Caminho absoluto: " + absolute);

Multiplataforma

Path e Files levam em conta as particularidades do SO (separadores, codificações etc.). Não escreva caminhos manualmente do tipo "C:\\folder\\file.txt" — use Paths.get e resolve.

Conversão entre File e Path

Se você tem código antigo com File, é fácil migrar para a nova API:

File legacy = new File("legacy.txt");
Path modern = legacy.toPath();
if (Files.exists(modern)) {
    // Agora você pode usar todos os recursos do NIO.2
}

Verificando a existência de um arquivo

Path path = Paths.get("notes.txt");
if (Files.exists(path)) {
    System.out.println("Arquivo encontrado!");
} else {
    System.out.println("O arquivo não existe.");
}

7. Mini prática: criando e verificando arquivo e diretório

import java.nio.file.*;

public class MiniPractice {
    public static void main(String[] args) throws Exception {
        Path dir = Paths.get("demo_dir");
        Path file = dir.resolve("hello.txt");

        // Criamos o diretório, se ele não existir
        if (!Files.exists(dir)) {
            Files.createDirectory(dir);
            System.out.println("Diretório criado: " + dir.toAbsolutePath());
        }

        // Criamos o arquivo, se ele não existir
        if (!Files.exists(file)) {
            Files.createFile(file);
            System.out.println("Arquivo criado: " + file.toAbsolutePath());
        }

        // Exibimos as propriedades
        System.out.println("O arquivo existe? " + Files.exists(file));
        System.out.println("É um arquivo? " + Files.isRegularFile(file));
        System.out.println("Tamanho: " + Files.size(file) + " bytes");

        // Excluímos o arquivo e o diretório (se desejar)
        Files.delete(file);
        Files.delete(dir);
        System.out.println("Arquivo e diretório excluídos.");
    }
}

8. Erros comuns ao trabalhar com File/Path/Files

Erro nº 1: confusão entre File e Path. Muitos iniciantes tentam usar os métodos Files com um objeto File. Lembre-se: Files.* funciona com Path. Se você tem um File, primeiro faça file.toPath().

Erro nº 2: esperar que criar um objeto File ou Path crie o arquivo. Um objeto de caminho é um atalho, não um arquivo real. Para criar, use Files.createFile(path) ou grave dados.

Erro nº 3: montar caminhos manualmente como string. Não escreva "folder/file.txt" ou "folder\\file.txt". Use Paths.get(...) e resolve(...). É mais seguro e multiplataforma.

Erro nº 4: ignorar exceções. Operações com arquivos lançam IOException e outras exceções. Trate-as com try-catch ou propague (throws).

Erro nº 5: verificar com File.exists(), e depois trabalhar com Path. Procure manter um único estilo: começou com Path — use Files.exists(path) e os demais métodos de Files.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION