Sitemap
Pedro Aquino

Pedro Aquino

Amante por músicas e cético filosófico, sempre muito absorto.

Arquivos — Java

5 min readDec 31, 2024

--

Existem várias maneiras de manipular arquivos em Java, principalmente por conta da evolução do Java.

Press enter or click to view image in full size
Photo by Joachim Schnürle on Unsplash

Os pacotes java.io e java.nio são responsáveis pela entrada e saída de dados em Java. Emboras ambos forneçam funcionalidades semelhantes, existem diferenças importantes entre eles.

Referência: Leitura de arquivos em Java: exemplos e diferenças entre as versões 6, 7 e 11

FileReader e BufferedReader são classes em Java utilizadas para ler dados de arquivos, mas possuem diferenças importantes em relação ao desepemenho e funcionalidade:

FileReader

  • Função: Lê caracteres de arquivos de texto.
  • Direto no disco: Faz a leitura diretamente do disco, caractere por caractere.
  • Desempenho: Pode ser mais lento, pois não utiliza buffer (armazenamento temporário de dados).
  • Uso típico: É simples e adequado para leitura básica ou arquivos pequenos.

BufferedReader

  • Função: Envolve um leitor, como FileReader, para realizar leitura eficiente em buffer.
  • Com buffer: Lê dados em blocos, armazenando temporariamente em memória, melhorando o desempenho para grandes arquivos.
  • Recursos adicionais: Possui métodos como readLine() para ler linhas inteiras de uma vez
  • Uso típico: Indicado para leitura de arquivos maiores ou quando linhas inteiras precisam ser processadas.
package application;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Program {
public static void main(String[] args){

String path = "C:\\Users\\pedro\\Downloads\\java.txt";
FileReader fr = null;
BufferedReader br = null;

try {
fr = new FileReader(path);
br = new BufferedReader(fr);

String line = br.readLine();
/* Ler uma linha do arquivo e no final da linha retorna null */

while (line != null){
System.out.println(line);
line = br.readLine();
}
} catch (IOException e){
System.out.println("Erro! " + e.getMessage());
} finally {
try {
if (br != null){
br.close();
} else if (fr != null){
fr.close();
}
} catch (IOException e){
e.printStackTrace();
}
}
}
}

O bloco try-catch é essencial em java para lidar com exceções, sendo situações anormais ou erros que podem ocorrer durante a execução do programa. Ela permite que você trate esses problemas de forma controlada, evitando que o programa seja encerrado abruptamente.

O bloco adicional finallyé sempre executado, independentemente de ocorrer ou não uma execução. Usado para limpar recursos como arquivos ou conexões.

É necessário encerrar as classes para não gerar acumulo de memória desnecessária no disco, pois caso contrário o programa ainda estaria tentando fazer as operações necessárias para executar o algorítimo.

Ao lidarmos com arquivos, o try-catch se faz presente, pois em alguns casos o código pode retornar uma IOException.

A IOException é essencial para tratar erros que ocorrem durante operações de entrada e saída, ajudando a garantir que o programa lide de forma robusta com problemas inesperados, como falta de arquivos, permissões inadequadas ou interrupções de rede.

Quando a IOException é lançada?

Leitura/gravação de arquivos:

  • Tentativa de acessar um arquivo que não existe.
  • Falha ao escrever em um arquivo devido a permissões ou espaço insuficiente.
  • Problemas ao abrir ou fechar arquivos.

Há uma maneira menos verbosa para o código, utilizando o try-with-resources

Get Pedro Aquino’s stories in your inbox

Join Medium for free to get updates from this writer.

Gerenciamento automático de recursos:

  • Recursos como BufferedReader, FileWriter, e Connection precisam ser fechados manualmente com o método close() para liberar memória ou recursos do sistema.
  • O try-with-resources elimina a necessidade de fechar explicitamente esses recursos, evitando, erros comuns, como vazamentos de memória.

Código mais limpo:

  • Reduz o uso do bloco finally e evita repetições de código.

Seguro contra exceções:

  • Garante que o fechamento do recurso será realizado mesmo se uma exceção for lançada no bloco try.
package application;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Program {
public static void main(String[] args){

String path = "C:\\Users\\pedro\\Downloads\\java.txt";

try (BufferedReader br = new BufferedReader(new FileReader(path))) {

String line = br.readLine();

while (line != null){
System.out.println(line);
line = br.readLine();
}
} catch (IOException e){
System.out.println("Erro! " + e.getMessage());
}
}
}

FileWriter e BufferedWriter são classes da biblioteca Java que facilitam a gravação de dados em arquivos. Ambas pertencem ao pacote, java.io sendo usadas em conjunto para otimizar operações de escrita.

Press enter or click to view image in full size

FileWriter

Descrição: A classe FileWriter é usada para gravar diretamente em um arquivo. Ela permite gravar caracteres individuais, arrays de caracteres ou strings em um arquivo.

Características:

  • Grava os dados diretamente no disco
  • Não utiliza buffer interno, o que pode torná-la menos eficiente para grande volumes de dados.
  • Pode ser configurada para sobrescrever ou adicionar dados ao arquivo (modo “append”).
  • Construtor:
FileWriter(String fileName);                // Sobrescreve o arquivo
FileWriter(String fileName, boolean append); // Adiciona dados ao arquivo se 'append' for true

A primeira forma de instanciar o FileWriter cria o arquivo se ele não existir e recria o arquivo se ele foi criado outrora. A segunda forma verifica se o arquivo já foi criado, caso já tenha sido criado, novos valores são adicionadas no fim desse documento.

Cria/recria o arquivo: new FileWriter(caminho do arquivo);
Acrescenta ao arquivo existente: new FileWriter(caminho do arquivo, true);

BufferedWriter

Descrição: A classe BufferedWriter é um wrapper que adiciona um buffer ao Writer (como FileWriter). O buffer armazena os dados temporariamente, melhorando o desempenho ao reduzir o número de operações de escrita no disco.

Característica:

  • Usa um buffer interno para armazenar os dados antes de gravá-los fisicamente no arquivo.
  • Ideal para grandes volumes de dados ou múltiplas operações de escrita.
  • Possui o método newLine() para adicionar quebras de linha de forma independente do sistema operacional.
  • Construtor:
BufferedWriter(Writer writer);
Press enter or click to view image in full size

Note que no bloco de notas há duplicidade nas linhas do arquivo, pois rodei o código duas vezes e por ter a append true na linha try, ele adiciona novas strings no fim do documento, ao invés de recriar o documento. Caso esse true estivesse omisso no código, o arquivo sempre seria recriado e permaneceria sempre com a mesma quantidade de linhas declaradas no vetor Line, declarado no início do algorítimo.

Press enter or click to view image in full size

Autor: Pedro Vitor Aquino Ferreira

--

--

Pedro Aquino
Pedro Aquino

Written by Pedro Aquino

Amante por músicas e cético filosófico, sempre muito absorto.