Como ler caracteres de um arquivo em Java
Em algum momento você vai precisar ler um arquivo .txt e como fazer isso?
Inicialmente, crie um arquivo chamado "file.txt", e o bote dentro do projeto de Java, junto das pastas src e bin. Escreve apenas a letra 'a' nesse arquivo.
Para abrir este arquivo, iremos usar a classe FileInputStream que irá receber uma string que representa o local onde está armazenado o arquivo em seu computador.
Como ele está na pasta do próprio projeto, apenas colocamos o nome do arquivo: file.txt
Mas você pode colocar o endereço completo: /usr/Java/Arquivos/file.txt
Vamos chamar de "entrada" o objeto responsável pela abertura do arquivo.
Como queremos trabalhar com caracteres, a maneira que este objeto vai ler o arquivo é uma maneira especial, pois deve ler bytes que representem caracteres.
Vamos usar a classe InputStreamReader para 'tratar' esse objeto que abriu o arquivo, essa classe vai fazer com que a leitura do arquivo seja uma leitura específica, uma leitura de caracteres.
Vamos chamar esse objeto de 'entradaFormatada'.
E, finalmente, para ler o primeiro caractere do arquivo (não importa quantos bytes tenham sido lidos, pois aInputStreamReader já tratou de ler e formatar essa entrada para caractere) iremos usar o método read(), que retorna um inteiro que representa o caractere.
Assim, nosso código que lê esse primeiro caractere fica:
import java.io.*; public class Arquivos { public static void main(String[] args) throws IOException{ FileInputStream entrada = new FileInputStream("file.txt"); InputStreamReader entradaFormatada = new InputStreamReader(entrada); int c = entradaFormatada.read(); System.out.println(c); } }
O resultado deve ser 97, que é a representação de 'a'. Para podermos exibir na tela o caractere 'a', basta fazermos o cast para char:
System.out.print( (char) c);
Lendo mais de um caractere - Fim de arquivo
Ok, aprendemos a ler um caractere de um arquivo.
Mas, e para ler outro? Usar o método de novo? Sim, funciona.
E se seu arquivo for um texto enorme, de milhares de caracteres, usar milhares de vezes o read() ?
Óbvio que não. Podemos usar um looping, como através do laço while, que deve ler todos os caracteres e só parar quando terminar o arquivo.
E como que vamos saber quando termina o arquivo? Fácil: o maravilhoso método read() retorna o valor -1 quando isso ocorre. E ele faz outra coisa interessante: após ele ler um caractere, ele imediatamente aponta para o próximo.
Assim, escreva em seu arquivo 'file.txt' o seguinte texto (ou qualquer outro): Apostila Java Progressivo
Para exibir todo o conteúdo de texto de um arquivo, usaremos o seguinte código:
import java.io.*; public class Arquivos { public static void main(String[] args) throws IOException{ FileInputStream entrada = new FileInputStream("file.txt"); InputStreamReader entradaFormatada = new InputStreamReader(entrada); int c = entradaFormatada.read(); while( c!=-1){ System.out.print( (char) c); c = entradaFormatada.read(); } } }
PS: Quando você cria o código de leitura de arquivos, automaticamente a IDE insere o 'throws IOException', para tratar eventuais erros e exceções.