#100DaysOfCode: Dia 9 - Trabalhando com Arquivos.
Tags: java, 100daysofcode, beginners, programming
Published: 2023-07-06 22:15:36

Manipulação de arquivos não me pareceu ser algo trivial quando se trata de desenvolvimento de softwares, pois com os bancos de dados facilitando armazenamento de dados, seria muito mais trabalhoso lidar com arquivos.
Mas ainda sim, vejo suma importância nesses conceitos, pois há muitos arquivos ainda que precisam de manipulação, além de ser uma ótima maneira de brincar um pouco para treinar conhecimentos.

Hoje vi 3 classes para lidar com arquivos: File, FileReader e BufferedReader. Ambas tem suas peculiaridades e similaridades, irei abordar as que achei mais interessante.

- **File:** É uma representação abstrata de um arquivo ou um diretório. Cada sistema operacional opera de maneira diferente para lidar com seus diretórios e arquivos, por exemplo:
O _Linux_, para fazer buscas de seus arquivos e pastas usa a barra normal '/': _meuDiretorio/meu-arquivo.txt_. Já o Windows faz o uso da barra invertida '\' para ter o mesmo resultado: _meuDiretorio\meu-arquivo.txt_.
O termo usado para essas diferenças é _system dependent_ (dependendo do sistema).
O que a classe file faz é conseguir lidar com essas diferenças independente do sistema (_system independent_).

- **FileReader:** FileReader faz a leitura de uma sequencia de caracteres, lendo apenas 1 caracter por vez. Através do construtor, da mesma maneira como é feito com a classe _File_, menciona-se o caminho do arquivo que irá fazer a leitura.

- **BufferedReader:** Faz a leitura em blocos de caracteres, suportando uma maior quantidade de caracteres com isso diminuindo o uso de recursos de discos do computador, que consequentemente, melhora o desempenho.

Vendo apenas os exemplos, fiquei confuso de qual a diferença entre eles, vendo que eu consigo fazer a leitura em todos eles, me pareceu redundante haver tantas classes para um mesmo resultado.
Lendo as documentações oficiais da Oracle percebi que há muitas diferenças e irei mencionar as que acredito ter compreendido melhor.

**1. Flexibilidade:** A classe _File_ é mais flexível, podendo realizar diversas operações, muito além de apenas leituras de texto.
Com o _File_ é possivel criar pastas, criar arquivos, deletar e escrever em arquivos, por exemplo.
Já as classes _FileReader_ e _BufferedReader_, essas sim, são  apenas para a leitura de arquivos de texto e ambos são usados em conjunto, e o motivo para isso é a diferença de número 2.

**2. Performance:** O _FileReader_ realiza a leitura de uma caracter por vez, prejudicando muito a performance, além de, como já mencionando anteriormente, consumindo muito espaço em disco, por isso ele é usado em conjunto com o _BufferedReader_. O _BufferedReader_ resolve exatamente esses problemas, lendo uma grande quantidade de sequência de caracteres, dividindo por blocos.
Então para apenas para a leitura de arquivos, não há necessidade de uso da classe _File_, feriria o princípio de melhorar a performance.

**É possivel fazer a leitura de texto usando apenas o FileReader?**
Sim, mas leituras de arquivos geralmente vão ter um grande fluxo de caracteres, e o **FileReader** não performa muito bem fazendo isso de maneira independente, por conta disso, geralmente, vão ser visto exemplos de uso conjunto entre FileReader e BufferedReader.

> **Fontes:**
https://docs.oracle.com/javase/7/docs/api/java/io/File.html#File(java.lang.String)
https://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html#FileReader(java.lang.String)
https://docs.oracle.com/javase/10/docs/api/java/io/BufferedReader.html

_Gostou do texto?
Tem alguma dica, correção ou sugestão?
Por favor, fique a vontade para revisar e pontuar qualquer erro ou confusão que possa ter acontecido, ficarei feliz em corrigir._