Files
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:
| Classe | Descrição |
|---|---|
| java.nio.file.Path | Interface que representa um diretório de nosso sistema operacional |
| java.nio.file.Paths | Classe que contém o recurso de criar um objeto que represente o diretório informado |
| java.nio.file.Files | Classe 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
Barra invertida precisa ser escapada utilizando
\\No Java, \ é caractere especial, então no Windows você deve usar:
"C:\\java-nio\\aula.txt"
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
);
}
}
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
PatheFilesem vez deFile - Use
Files.lines()para arquivos grandes - Utilize
try-with-resourcesao 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
| Sistema | Separador | Exemplo de caminho |
|---|---|---|
| Windows | \ (barra invertida) | C:\Users\Aluno\Documentos\arquivo.txt |
| Linux / macOS | / (barra normal) | /home/aluno/documentos/arquivo.txt |
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
| Sistema | Raiz típica |
|---|---|
| Windows | Letra da unidade + :\ (ex: C:\) |
| Linux / macOS | Apenas / (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.txt≠arquivo.txt)
5. Boas práticas ao criar caminhos
- Use sempre
Path.of()ouPaths.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");
}
}
| Sistema | Caminho final |
|---|---|
| Windows | C:\Users\SeuUsuario\anexos\arquivo.txt |
| Linux | /home/seuusuario/anexos/arquivo.txt |
| macOS | /Users/seuusuario/anexos/arquivo.txt |