Java: Class Scanner ( a classe Scanner) - Lendo e Recebendo dados de arquivos


Agora que já escrevemos dados em um arquivo, vamos aprender como ler dados de um arquivo existente em disco.



Receber dados é 'input', então podemos fazer usando a Scanner. A diferença é que, em vez de receber a entrada pelo teclado, vamos receber os dados de um arquivo.
Assim como na Class Formatter, coloquei algumas exceções para o programa ficar mais robusto, estável e para que você tenha o conhecimento de alguns dos métodos de tratamento de erros. As explicações estão nas strings do código-fonte.

Crie um arquivo chamado "teste.txt" e escreva algo nele, de preferência algo com espaços em branco, tabs e quebras de linhas para você ver o que acontece.
Eu coloquei:
linha 1
linha 2
linha 3

Vamo aos códigos fonte:


Lendo.java
public class Lendo
{
    public static void main(String[] args)
    {
        LendoMetodos teste = new LendoMetodos();
        teste.abrir();
        teste.ler();
        teste.fechar();
    }
}


LendoMetodos.java
import java.io.File;
import java.util.Scanner;
import java.lang.IllegalStateException;
import java.util.NoSuchElementException;
import java.io.FileNotFoundException;

public class LendoMetodos
{
    private Scanner entrada;
 
    public void abrir()
    {
        try
        {
            entrada = new Scanner( new File("teste.txt") );
        }
        catch(FileNotFoundException arquivoNaoEncontrado)
        {
            System.err.println("Nao foi possível abrir o arquivo! Não encontrado!");
            System.exit(1); //saída de erro
        }
    }
 
    public void ler()
    {
        try
        {
            while( entrada.hasNext() )          
                System.out.printf("%s - %d\n",entrada.next(), entrada.nextInt());
        }
        catch(NoSuchElementException entradaDiferente)
        {
            System.err.println("Entrada diferente da esperada");
            entrada.close();
            System.exit(1);
        }
        catch(IllegalStateException erroLeitura)
        {
            System.err.println("Erro de leitura. Scanner foi fechada antes da input");
            System.exit(1);
        }
    }
 
    public void fechar()
    {
        entrada.close();
    }
}


O looping: while( entrada.hasNext() )

mostra linha por linha do arquivo, até o final. Assim, o processamento e formatação é feito tendo em mente esse raciocínio, por linha.
A formatação é você quem escolhe, usando entrada.next(), entrada.nextInt(), entrada.nextDouble() etc.

Mais uma vez, ao término do uso do arquivo, fechá-lo: entrada.close()

Nenhum comentário:

Veja também: