1. Introdução
Em programação, quase sempre é preciso trabalhar com arquivos. Os exemplos são conhecidos por todos: salvar o texto de uma anotação, o progresso de um jogo, copiar uma imagem ou ler configurações de um arquivo de configuração.
No Java, há ferramentas modernas e convenientes para isso: Path e Files do pacote java.nio.file. Elas permitem, em poucas linhas de código, abrir um arquivo, ler seu conteúdo, gravar texto ou até copiar uma imagem.
Caminho para o arquivo (Path)
Um arquivo sempre está em algum lugar no disco e, para acessá-lo, é preciso indicar o caminho. Para isso, no Java existe a classe Path, e é possível criar um novo objeto com o método Path.of().
Path path = Path.of("hello.txt"); // caminho relativo
Path absPath = Path.of("C:/Users/Me/image.png"); // caminho absoluto (Windows)
Explicação:
- O caminho relativo procura o arquivo na pasta atual do projeto (por exemplo, "hello.txt").
- O caminho absoluto indica o endereço completo: unidade, pastas e nome do arquivo.
2. Trabalhando com arquivos de texto
Do ponto de vista do Java, todos os arquivos se dividem em 2 tipos — de texto e binários. Se o conteúdo pode ser representado como texto compreensível para uma pessoa, é um arquivo de texto. Em todos os outros casos, é apenas um conjunto de bytes (arquivo binário).
Gravar texto em arquivo — writeString
Para gravar uma string em um arquivo, usamos o método writeString.
Path p = Path.of("hello.txt");
Files.writeString(p, "Olá, arquivo!");
O que aconteceu aqui:
- criamos um objeto Path que aponta para "hello.txt";
- gravamos a string nele com o método writeString;
- se o arquivo não existir, ele será criado automaticamente.
Assim, é fácil salvar anotações ou mensagens em um arquivo de texto.
Ler texto de um arquivo — readString
O método readString permite carregar o arquivo inteiro diretamente para uma string.
Path p = Path.of("hello.txt");
String content = Files.readString(p);
System.out.println(content);
Agora, a variável content contém o conteúdo do arquivo. Isso é conveniente para arquivos pequenos: arquivos de configuração, textos e documentos JSON.
3. Trabalhando com arquivos binários
Nem todos os arquivos são de texto. Imagens, músicas, arquivos compactados — são conjuntos de bytes. Para trabalhar com eles, existem os métodos write e readAllBytes.
Gravar bytes em arquivo — write
O método write() permite gravar em um arquivo um array de bytes. Ele também é chamado de buffer (byte buffer).
byte[] data = {65, 66, 67, 68}; // caracteres A B C D
Files.write(Path.of("letters.bin"), data);
Aqui gravamos no arquivo um array de bytes. Se você abrir o arquivo como texto, dentro estarão as letras "ABCD".
Ler bytes — readAllBytes
Para obter de volta o conteúdo do arquivo como um array de bytes, usamos o método readAllBytes.
byte[] buffer = Files.readAllBytes(Path.of("letters.bin"));
// imprime no console o array de bytes lido
for (byte b : buffer)
{
System.out.print((char)b + " ");
}
Saída:
A B C D
Esse método é usado para trabalhar com quaisquer arquivos binários — imagens, documentos, músicas.
4. Cenários populares de trabalho com arquivos
O cenário mais comum de trabalho com arquivos é, provavelmente, copiar um arquivo.
Copiando arquivos
Para copiar um arquivo, você pode simplesmente lê-lo em um array de bytes e gravá-lo em outro arquivo.
Path in = Path.of("logo.png");
Path out = Path.of("logo_copy.png");
byte[] bytes = Files.readAllBytes(in);
Files.write(out, bytes);
Dessa forma, é possível copiar imagens, documentos e quaisquer outros arquivos, sem se preocupar com o formato.
Verificando existência e tamanho
Às vezes é preciso garantir que o arquivo existe e descobrir seu tamanho. Para isso, há os métodos exists e size.
Path p = Path.of("hello.txt");
if (Files.exists(p))
{
long size = Files.size(p);
System.out.println("Arquivo encontrado, tamanho: " + size + " bytes");
}
else
{
System.out.println("Arquivo não encontrado!");
}
Isso é útil para diagnóstico: você saberá exatamente se está trabalhando com o arquivo correto.
5. Exceções
O trabalho com arquivos pode terminar com erro: o arquivo não existe, não há permissões de acesso, o disco está cheio ou o arquivo está em uso por outro programa. Portanto, é preciso envolver o trabalho com o disco em try-catch, ou propagar as exceções para fora usando throws.
try
{
String content = Files.readString(Path.of("hello.txt"));
System.out.println(content);
}
catch (IOException e)
{
System.out.println("Erro ao ler: " + e.getMessage());
}
Assim, o programa não vai “travar”, mas informará educadamente ao usuário o que aconteceu. Se necessário, é possível propagar a exceção IOException mais adiante na pilha a partir do método usando a palavra‑chave throws.
GO TO FULL VERSION