Dúvida sobre como ler um arquivo texto

Bom dia, caros colegas deste Forum.
Estava estudando como gravar e ler um arquivo de texto. Consegui gravar as informações, mas agora estou tendo dificuldade em como ler esse arquivo. Aqui segue o código completo, com as classes. A Classe LerAluno está incompleta, justamente porque não sei bem o que fazer nesse código. O Interessante não é só escrever, é entender.

Agradeço a ajuda. :wink:

//Aqui temos a classe Aluno
 
/**
 * @author Armando
 */
class Aluno {
    String pNome;
    String uNome;
    int pontos;
    Aluno(){
        this("","",0);
    }
      Aluno(String pNomeAluno,String uNomeAluno, int pontosAluno){
        pNome = pNomeAluno;
        uNome = uNomeAluno;
        pontos = pontosAluno;
      }
 }


import java.io.*;
import javax.swing.*;
public class GravaAluno {
    public static void gravar() throws IOException{
        Aluno[] aluno = new Aluno[3];
        int i;
        String nomeArq = "ArquivoAluno.txt";
        BufferedWriter bw = new BufferedWriter(new FileWriter(nomeArq));
        
        for(i=0;i<3;i++) aluno[i]=new Aluno();
        
        for (i=0;i<3;i++){
            aluno[i].pNome = JOptionPane.
                 showInputDialog(null,"Digite o primeiro NOME: ");
            bw.write(aluno[i].pNome);
            bw.newLine();
            aluno[i].uNome = JOptionPane.
                 showInputDialog(null,"Digite o SEGUNDO NOME: ");
            bw.write(aluno[i].uNome);
            bw.newLine();
            aluno[i].pontos = Integer.parseInt(JOptionPane.
                 showInputDialog(null,"Digite os PONTOS: "));
            bw.write(aluno[i].pontos);
            bw.newLine();
        }
        for(i=0;i<3;i++){
            System.out.println(aluno[i].pNome + " "
                    + aluno[i].uNome + " "
                    + aluno[i].pontos);
                   
        }
        bw.close();
        System.exit(0);
    }
}

// ESTA CLASSE QUE NÃO FUNCIONA COMO DEVE SER

import java.io.*;
public class LerAluno {
    public static void ler() throws IOException{
        Aluno[] aluno = new Aluno[3];
        BufferedReader bif = 
        new BufferedReader(new FileReader("ArquivoAluno.txt"));
        
        int i=0;
        for(i=0;i<3;i++) aluno[i]=new Aluno();
        i=0;
        while(bif.readLine()==null){
            bif.readLine();
            System.out.println(aluno[i].pNome);
            bif.readLine();
            System.out.println(aluno[i].uNome);
            bif.readLine();
            System.out.println(aluno[i].pontos);
           i++;
        }
    bif.close();
    System.exit(0);
    }
}

// Programa Principal

import java.io.IOException;
import javax.swing.JOptionPane;

public class TestaDados {
    public static void main(String args[]) throws IOException{
        
       int resp = JOptionPane.showConfirmDialog(null,"Deseja GRAVAR o Arquivo - YES \n"
               + "NO - Deseja LER no Arquivo", "ATENÇÃO",1);
       if (resp==1){
           LerAluno.ler();
       }else{
           GravaAluno.gravar();
       }
    }
}

Oi,

qual a sua dúvida, para ser exato?!
E está gerando exceção?!

Concorda comigo que simplesmente dizer que tem dúvidas na leitura de arquivo não esclarece muitas coisas, certo?
Abraços.

OK! Ocorre que na hora de mostrar resultados da leitura, além de não mostrar nada no console, certamente entra em looping, pois dá uma exception. Não sei onde estou errando na forma de retornar os dados do arquivo, é isso. Desculpa aí, por não especificar…

run:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3

0

0

0
at LerAluno.ler(LerAluno.java:14)
at TestaDados.main(TestaDados.java:11)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 4 segundos)

Armando,
Bom dia!

Recomendo a seguinte leitura para entender melhor o funcionamento com arquivos no Java.

http://www.guj.com.br/articles/13

Sobre essa Exception que esta ocorrendo check a maneira de como esta alimentando ou lendo seu array.

Recomendo você primeiro alimentar o seu vetor e depois criar um método para exibir os dados.

Espero ter ajudado.

Abrs,

Danilo Santos

Obrigado, acredito que consiga ajustar com isto. Abraços.

Oi,

o seu Array de Alunos está definido com o tamanho 3, portanto, ele não pode acessar a posição do vetor 3, que é exatamente o que aponta o erro.
Quando se define o vetor, é o tamanho -1, já que ele inicia em 0, ou seja:

aluno[0], aluno[1] e aluno[2]. É assim que está seu array.
Acontece que aqui:

while(bif.readLine()==null){ bif.readLine(); System.out.println(aluno[i].pNome); bif.readLine(); System.out.println(aluno[i].uNome); bif.readLine(); System.out.println(aluno[i].pontos); i++; }

Ele está ultrapassando o i em 2, ou seja, 3 e por isso mesmo gera o erro.
Veja, você está fazendo quatro readLine() no mesmo bloco, começa no while e mais três dentro. Está errado essa leitura colega.
Seu primeiro passo é arrumar essa laço de repetição e fazer algo coerente. O que mais tem são exemplos de leitura/escrita de arquivos, ok?

Recomendo o PrintWriter.
Abraços!

Sim, entendi o que ocorre. Apenas não estou entendendo qual o conjunto de instruções que trazem os dados do arquivo texto para uma saída em System.out.print, por exemplo… Mas vou tentar por aqui. Obrigado.

A resposta do nel está correta, e seu laço while está errado, por isso não exibe nada no console:

while(bif.readLine()==null){
    bif.readLine();  
    System.out.println(aluno[i].pNome);  
    bif.readLine();  
    System.out.println(aluno[i].uNome);  
    bif.readLine();  
    System.out.println(aluno[i].pontos);  
    i++;  
}
//Essa linha diz: "Enquanto o que o retorno do método readLine() for null, 
//faça. O retorno dele NÃO é null, já que você está lendo dados de um 
//arquivo, portanto, ele NUNCA entra nesse laço.
while(bif.readLine()==null){ 

Corrija-o, utilizando-o dessa forma:

String conteudoDoArquivo = "";
while((conteudoDoArquivo = bif.readLine()) != null){
    System.out.println(conteudoDoArquivo);
}

Espero ter ajudado.
^^

Rafael, até funcionou, porém não consegui colocar na array desta forma, você teria alguma ideia?

aluno[i].pNome
aluno[i].uNome
aluno[i].pontos // lembrando que este é Integer

Não entendi o que você quer fazer, inserir isso num array novamente? Ou apenas exibir, se for exibir da forma que te passei está correta.

Sim, seria recolocar os dados do arquvo de volta na array, para apresentar no console de forma fique algo assim:

Aluno(0): Jona Soares Pontos = 10
Aluno(1): Luis Carlos Pontos = 7
Aluno(2): José Silva Pontos = 8

[quote=Armando Pereira]Sim, seria recolocar os dados do arquvo de volta na array, para apresentar no console de forma fique algo assim:

Aluno(0): Jona Soares Pontos = 10
Aluno(1): Luis Carlos Pontos = 7
Aluno(2): José Silva Pontos = 8[/quote]

O ideal então é que na criação do arquivo utilize um delimitador qualquer, para diferenciar uma coluna da outra.
Pode ser espaço em branco, ponto e vírgula, enfim, qualquer um. Supondo que o delimitador seja ‘|’, seu arquivo seria algo como:

João | 10

A cada linha lida do arquivo, você teria a String no mesmo formato, ou seja:

String linha = "João | 10";

Dessa forma, consegue quebrar a String em partes e pegar os valores desejados usando split().
Veja:

String linha = "João | 10"; String[] valores = linha.split("|"); String nome = valores[0]; Integer pontos = Integer.parseInt(valores[1].trim());

Não esqueça de utilizar o método trim() ao menos nos pontos, para não rolar erro no parser para inteiro.
É basicamente isso.

Abraços.

OLÁ PESSOAL. Desculpe a demora para dar um retorno se deu certo ou não, após tantas dicas. Valeu está RESOLVIDO meu problema, inclusive arrumei mais algumas coisas. Deixo o meu código aqui. Certamente ainda tenho muito o que aprender, mas vamos por partes, chega lá… OBRIGADO A TODOS… :lol:


import java.io.IOException;
/**
 * @author Armando  09/10/2011
 */
public class TestaDados {
    public static void main(String args[]) throws IOException{
        Menu.menu();
    }
}

//------------------------------------------------------------------------------------
public class Aluno {
      String pNome;
      String uNome;
      int pontos;
     public Aluno(){
        this("","",0);
    }
    public Aluno(String pNomeAluno,String uNomeAluno, int pontosAluno){
        pNome = pNomeAluno;
        uNome = uNomeAluno;
        pontos = pontosAluno;
      }
 }

//------------------------------------------------------------------------------------
import java.io.IOException;
import javax.swing.JOptionPane;
public class Menu {
   public static void menu() throws IOException{
   int resp = JOptionPane.showConfirmDialog(null,"SIM - Deseja GRAVAR o Arquivo\n"
               + "\nNÃO - Deseja LER no Arquivo."
               + "\n\nCANCELA - Sai do programa.", "ATENÇÃO",1);
       switch(resp){
          case 0:
             GravaAluno.gravar();
             break;
          case 1:
             LerAluno.ler();
             break;
          case 2:
             System.out.println("Saindo do programa");
             System.exit(0);
             break;
       }
   }
}

//------------------------------------------------------------------------------------
import java.io.*;
public class LerAluno{

    public static void ler() throws IOException{
        Aluno[] aluno = new Aluno[3];
        BufferedReader bif =
        new BufferedReader(new FileReader("ArquivoAluno.txt"));

        int i;
        for(i=0;i<3;i++) aluno[i]=new Aluno();
                
       for (i=0;i<3;i++){
        aluno[i].pNome = bif.readLine();
        aluno[i].uNome = bif.readLine();
        aluno[i].pontos = Integer.parseInt(bif.readLine());
       }
        
        for(i=0;i<3;i++){
            System.out.println
            ("Aluno(" + i + "): "
             + aluno[i].pNome + " "
             + aluno[i].uNome
             + " Pontos = " +  aluno[i].pontos  );
        }
        
    bif.close();
    Menu.menu();
    }
}

//------------------------------------------------------------------------------------
import java.io.*;
import javax.swing.*;
public class GravaAluno {
    public static void gravar() throws IOException{
        Aluno[] aluno = new Aluno[3];
        int i;
        String nomeArq = "ArquivoAluno.txt";
        BufferedWriter bw = new BufferedWriter(new FileWriter(nomeArq));

        for(i=0;i<3;i++) aluno[i]=new Aluno();

        for (i=0;i<3;i++){
            aluno[i].pNome = JOptionPane.
                 showInputDialog(null,"Digite o primeiro NOME: ");
            bw.write(aluno[i].pNome);
            bw.newLine();
            aluno[i].uNome = JOptionPane.
                 showInputDialog(null,"Digite o SEGUNDO NOME: ");
            bw.write(aluno[i].uNome);
            bw.newLine();
            aluno[i].pontos = Integer.parseInt(JOptionPane.
                 showInputDialog(null,"Digite os PONTOS: "));
            bw.write(Integer.toString(aluno[i].pontos));
            bw.newLine();

        }
        for(i=0;i<3;i++){
            System.out.println
            ("Aluno(" + i + "): "
             + aluno[i].pNome + " "
             + aluno[i].uNome
             + " Pontos = " +  aluno[i].pontos  );
        }
        bw.close();
         Menu.menu();
    }
}

[quote=PereiraFatec]OLÁ PESSOAL. Desculpe a demora para dar um retorno se deu certo ou não, após tantas dicas. Valeu está RESOLVIDO meu problema, inclusive arrumei mais algumas coisas. Deixo o meu código aqui. Certamente ainda tenho muito o que aprender, mas vamos por partes, chega lá… OBRIGADO A TODOS… :lol:


import java.io.IOException;
/**
 * @author Armando  09/10/2011
 */
public class TestaDados {
    public static void main(String args[]) throws IOException{
        Menu.menu();
    }
}

//------------------------------------------------------------------------------------
public class Aluno {
      String pNome;
      String uNome;
      int pontos;
     public Aluno(){
        this("","",0);
    }
    public Aluno(String pNomeAluno,String uNomeAluno, int pontosAluno){
        pNome = pNomeAluno;
        uNome = uNomeAluno;
        pontos = pontosAluno;
      }
 }

//------------------------------------------------------------------------------------
import java.io.IOException;
import javax.swing.JOptionPane;
public class Menu {
   public static void menu() throws IOException{
   int resp = JOptionPane.showConfirmDialog(null,"SIM - Deseja GRAVAR o Arquivo\n"
               + "\nNÃO - Deseja LER no Arquivo."
               + "\n\nCANCELA - Sai do programa.", "ATENÇÃO",1);
       switch(resp){
          case 0:
             GravaAluno.gravar();
             break;
          case 1:
             LerAluno.ler();
             break;
          case 2:
             System.out.println("Saindo do programa");
             System.exit(0);
             break;
       }
   }
}

//------------------------------------------------------------------------------------
import java.io.*;
public class LerAluno{

    public static void ler() throws IOException{
        Aluno[] aluno = new Aluno[3];
        BufferedReader bif =
        new BufferedReader(new FileReader("ArquivoAluno.txt"));

        int i;
        for(i=0;i<3;i++) aluno[i]=new Aluno();
                
       for (i=0;i<3;i++){
        aluno[i].pNome = bif.readLine();
        aluno[i].uNome = bif.readLine();
        aluno[i].pontos = Integer.parseInt(bif.readLine());
       }
        
        for(i=0;i<3;i++){
            System.out.println
            ("Aluno(" + i + "): "
             + aluno[i].pNome + " "
             + aluno[i].uNome
             + " Pontos = " +  aluno[i].pontos  );
        }
        
    bif.close();
    Menu.menu();
    }
}

//------------------------------------------------------------------------------------
import java.io.*;
import javax.swing.*;
public class GravaAluno {
    public static void gravar() throws IOException{
        Aluno[] aluno = new Aluno[3];
        int i;
        String nomeArq = "ArquivoAluno.txt";
        BufferedWriter bw = new BufferedWriter(new FileWriter(nomeArq));

        for(i=0;i<3;i++) aluno[i]=new Aluno();

        for (i=0;i<3;i++){
            aluno[i].pNome = JOptionPane.
                 showInputDialog(null,"Digite o primeiro NOME: ");
            bw.write(aluno[i].pNome);
            bw.newLine();
            aluno[i].uNome = JOptionPane.
                 showInputDialog(null,"Digite o SEGUNDO NOME: ");
            bw.write(aluno[i].uNome);
            bw.newLine();
            aluno[i].pontos = Integer.parseInt(JOptionPane.
                 showInputDialog(null,"Digite os PONTOS: "));
            bw.write(Integer.toString(aluno[i].pontos));
            bw.newLine();

        }
        for(i=0;i<3;i++){
            System.out.println
            ("Aluno(" + i + "): "
             + aluno[i].pNome + " "
             + aluno[i].uNome
             + " Pontos = " +  aluno[i].pontos  );
        }
        bw.close();
         Menu.menu();
    }
}

[/quote]