Arquivos — Java
Existem várias maneiras de manipular arquivos em Java, principalmente por conta da evolução do Java.
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, eConnectionprecisam ser fechados manualmente com o métodoclose()para liberar memória ou recursos do sistema. - O
try-with-resourceselimina a necessidade de fechar explicitamente esses recursos, evitando, erros comuns, como vazamentos de memória.
Código mais limpo:
- Reduz o uso do bloco
finallye 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.
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 trueA 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);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.
Autor: Pedro Vitor Aquino Ferreira








