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.
//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();
}
}
}
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)
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:
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?
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.
//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){
[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.
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();
}
}