Classes

Files

Trabalhando com leitura e escrita de arquivos

O Java NIO fornece a classe utilitária Files, que simplifica operações comuns de entrada e saída, como criar, ler, escrever, copiar e excluir arquivos, de forma moderna e segura.

Vamos conhecer a principais classes para leitura e escrita de arquivos:

ClasseDescrição
java.nio.file.PathInterface que representa um diretório de nosso sistema operacional
java.nio.file.PathsClasse que contém o recurso de criar um objeto que represente o diretório informado
java.nio.file.FilesClasse que contém os recursos de leitura e escrita de arquivos de forma estática

Escrevendo em arquivos

Escrever texto em um arquivo (forma simples)

import java.nio.file.Files;
import java.nio.file.Path;
import java.io.IOException;

public class ExemploNio {
    public static void main(String[] args) throws IOException {

        Path caminho = Path.of("C:\\java-nio\\aula.txt");

        Files.writeString(
            caminho,
            "Escrevendo em um arquivo texto utilizando Java com Java-NIO"
        );
    }
}
  • Cria o arquivo se ele não existir
  • Sobrescreve o conteúdo se já existir
⚠️ Atenção
Barra invertida precisa ser escapada utilizando \\

No Java, \ é caractere especial, então no Windows você deve usar:

"C:\\java-nio\\aula.txt"
Se estiver com o JDK 11, fica mais fácil a utilização
import java.nio.file.Files;
import java.nio.file.Path;
import java.io.IOException;

public class ExemploNio {
    public static void main(String[] args) throws IOException {
       Path caminho = Path.of("C:", "java-nio", "aula.txt");
    }
}

E se o diretório não existir?

import java.nio.file.Files;
import java.nio.file.Path;
import java.io.IOException;

public class ExemploNio {
    public static void main(String[] args) throws IOException {
        Path diretorio = Path.of("C:", "java-nio");
        Files.createDirectories(diretorio);

        Path arquivo = diretorio.resolve("aula.txt");

        Files.writeString(
            arquivo,
            "Escrevendo em um arquivo texto utilizando Java com Java-NIO"
        );
    }
}

Escrevendo várias linhas

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

public class EscritaLinhas {

    public static void main(String[] args) throws Exception {

        Path diretorio = Path.of("C:", "java-nio");
        Files.createDirectories(diretorio);

        Path arquivo = diretorio.resolve("linhas.txt");

        List<String> linhas = List.of(
                "Gleyson Sampaio",
                "Joao Pedro",
                "Izabelly"
        );

        Files.write(arquivo, linhas);
    }
}

Adicionando conteúdo ao arquivo (append)

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;

public class EscritaAppend {

    public static void main(String[] args) throws Exception {
        System.out.println(System.getProperty("user.dir"));

        Path caminho = Path.of("log.txt");

        Files.writeString(
                caminho,
                "Nova linha de log\n",
                StandardOpenOption.CREATE,
                StandardOpenOption.APPEND
        );
    }
}
Neste exemplo o arquivo log.txt será gerado na pasta do seu projeto, consulte através do comando System.getProperty("user.dir")

Lendo arquivos

Lendo todo o conteúdo como String

import java.nio.file.Files;
import java.nio.file.Path;

public class LeituraString {

    public static void main(String[] args) throws Exception {

        Path caminho = Path.of("arquivo.txt");

        String conteudo = Files.readString(caminho);
        System.out.println(conteudo);
    }
}

Lendo todas as linhas

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

public class LeituraLinhas {

    public static void main(String[] args) throws Exception {

        Path caminho = Path.of("linhas.txt");

        List<String> linhas = Files.readAllLines(caminho);

        linhas.forEach(System.out::println);
    }
}

Lendo arquivo linha por linha (forma eficiente)

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;

public class LeituraStream {

    public static void main(String[] args) throws Exception {

        Path caminho = Path.of("linhas.txt");

        try (Stream<String> stream = Files.lines(caminho)) {
            stream.forEach(System.out::println);
        }
    }
}
  • Ideal para arquivos grandes
  • Não carrega tudo na memória de uma vez

Criando diretórios

import java.nio.file.Files;
import java.nio.file.Path;

public class CriarDiretorio {

    public static void main(String[] args) throws Exception {

        Path diretorio = Path.of("dados/relatorios");

        Files.createDirectories(diretorio);
    }
}

Verificando existência de arquivos

Path caminho = Path.of("arquivo.txt");

if (Files.exists(caminho)) {
    System.out.println("Arquivo existe");
}

Boas práticas com Java NIO

  • Prefira Path e Files em vez de File
  • Use Files.lines() para arquivos grandes
  • Utilize try-with-resources ao trabalhar com streams
  • Trate exceções de I/O adequadamente
  • Evite caminhos hardcoded em produção

Se quiser, o próximo nível seria:

  • copiar, mover e deletar arquivos
  • trabalhar com permissões
  • ler arquivos CSV ou logs
  • comparar Java IO × NIO na prática

Convenção de Diretórios em Linux e Windows

Quando trabalhamos com arquivos em Java, é importante entender a diferença na forma como sistemas operacionais representam diretórios. Isso evita problemas de caminho e torna o código portável.

1. Separador de diretórios

SistemaSeparadorExemplo de caminho
Windows\ (barra invertida)C:\Users\Aluno\Documentos\arquivo.txt
Linux / macOS/ (barra normal)/home/aluno/documentos/arquivo.txt
Em Java, a partir da versão 11, é recomendado usar Path.of() ou Paths.get() em vez de escrever o separador manualmente.
A API vai adaptar automaticamente o separador do sistema.
import java.nio.file.Path;

Path caminho = Path.of("dados", "relatorios", "arquivo.txt");
System.out.println(caminho); // Se Windows: dados\relatorios\arquivo.txt
                                // Se Linux: dados/relatorios/arquivo.txt

2. Raiz do sistema

SistemaRaiz típica
WindowsLetra da unidade + :\ (ex: C:\)
Linux / macOSApenas / (ex: /home/aluno)

3. Diretórios temporários

  • Windows: C:\Users\<usuario>\AppData\Local\Temp
  • Linux/macOS: /tmp

Java fornece uma forma portátil de acessar o diretório temporário:

String tempDir = System.getProperty("java.io.tmpdir");
System.out.println(tempDir);

4. Nomes de arquivos e diretórios

  • Windows: não diferencia maiúsculas de minúsculas (Arquivo.txt = arquivo.txt)
  • Linux/macOS: diferencia maiúsculas de minúsculas (Arquivo.txtarquivo.txt)
Isso é crítico em sistemas que precisam rodar em ambos os ambientes.

5. Boas práticas ao criar caminhos

  • Use sempre Path.of() ou Paths.get() em vez de escrever caminhos manualmente
  • Evite caracteres especiais no nome de arquivos (:, ?, *, <, >, |)
  • Use subpastas para organizar arquivos por tipo ou finalidade
  • Evite caminhos muito longos, especialmente no Windows (> 260 caracteres pode dar problema)

Essa abordagem garante que o seu código Java funcione tanto em Linux quanto em Windows, sem precisar alterar manualmente os caminhos.

6. Multi Sistemas

As vezes queremos manter a mesma estrutura de diretorios considerando as convenções aplicados nos respectivos sistemas operacionais sem precisar modificar nosso código. Veja o exemplo abaixo:

import java.nio.file.Files; import java.nio.file.Path;

public class ExemploPath {
    public static void main(String[] args) throws Exception {

        Path raiz = Path.of(System.getProperty("user.home"), "anexos");

        Files.createDirectories(raiz);

        Path arquivo = raiz.resolve("arquivo.txt");

        Files.writeString(arquivo, "Conteúdo do arquivo");
    }
}
SistemaCaminho final
WindowsC:\Users\SeuUsuario\anexos\arquivo.txt
Linux/home/seuusuario/anexos/arquivo.txt
macOS/Users/seuusuario/anexos/arquivo.txt
Mesmo código, caminhos corretos para cada SO.