[RESOLVIDO] Arquivo de Acesso Aleatório e ArrayList

Bom, estou fazendo uma atividade onde devo trabalhar com Arquivo de acesso aleatorio. O programa é para cdastras alunos de uma escola e ter um menu simples com opções(Ainda estou usando o JOptionPane) para ser mais rapido.

tenho minha classe com os atributos de aluno.

package CadastroAlunos;

public class Aluno {

    private String nome;
    private String cpf;
    private long ra;
    private String curso;

    public Aluno(String nome, String cpf, long ra, String curso) {
        this.nome = nome;
        this.cpf = cpf;
        this.ra = ra;
        this.curso = curso;
    }

    public Aluno() {

    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public long getRa() {
        return ra;
    }

    public void setRa(long ra) {
        this.ra = ra;
    }

    public String getCurso() {
        return curso;
    }

    public void setCurso(String curso) {
        this.curso = curso;
    }

    public String imprimirDadosAluno() {
        return "Nome: " + this.nome + " \tCPF: " + this.cpf + "\nRegistro de Aluno: " + this.ra + " \tCurso: " + this.curso;
    }
} 

Minha classe de teste com o menu de opções:

package CadastroAlunos;


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

public class TestaAluno {

    public static void main(String[] args) throws FileNotFoundException, IOException {
        Aluno aluno;
        int opcao;

        do {

            opcao = Integer.parseInt(JOptionPane.showInputDialog(
                      "1 - Cadastrar Aluno\n"
                    + "2 - Buscar Aluno\n"
                    + "3 - Imprime dados de todos os alunos\n"
                    + "4 - Salva dados de todos os alunos \n"
                    + "5 - Lê os dados de todos os alunos\n"
                    + "6 - Sair\n"
                    + "Escolha uma opcao:"));

            switch (opcao) {

                case 1:
                    aluno = new Aluno();
                    aluno.setNome(JOptionPane.showInputDialog("Nome:"));
                    aluno.setCpf(JOptionPane.showInputDialog("CPF:"));
                    aluno.setRa(Long.parseLong(JOptionPane.showInputDialog("RA:")));
                    aluno.setCurso(JOptionPane.showInputDialog("Curso:"));
                    
                    GerenciaAlunos.insereAluno(aluno);
                    break;

                case 2:
                    long ra = Long.parseLong(JOptionPane.showInputDialog("Entre com RA:"));
                    JOptionPane.showMessageDialog(null, GerenciaAlunos.buscaAluno(ra));
                    break;                  
               
                case 3:
                    JOptionPane.showMessageDialog(null,GerenciaAlunos.imprimeDadosTodosAlunos());
                    break;

                case 4:
                    GerenciaAlunos.salvaTodosAlunos();
                    JOptionPane.showMessageDialog(null,"Arquivos Salvos");
                    break;

                case 5:
                    JOptionPane.showMessageDialog(null,GerenciaAlunos.leTodosAlunos());
                  break;

                case 6:
                    System.exit(0);
                    break;
                default:
                    System.exit(0);
                    break;

            }

        } while (true);

    }
}

Meu problema é o seguinte,crio um arraylist para armazenar todos os alunos e dados cadastrados. Depois percorro esse arraylist e armazeno em um arquivo de acesso aleatorio “aluno.txt”. Porém, o exercicio pede para eu percorrer esse arquivo e salvar as informações novamente no arrayList (Imagino que terá informações repetidas mas isso não é o ponto).

Não estou sabendo por onde acertar para que meus ponteiros de leitura do RandomAcessFile para que ele capture todos os dados independentes do tamanho. Estou salvando cada dado em uma linha para ver se facilita. Alguem poderia me ajudar? Dicas de melhoria no codigo, principalmente a parte de RandomAcessFile será muito bem vinda. Segue codigo:

package CadastroAlunos;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class GerenciaAlunos {

    private static ArrayList<Aluno> aluno = new ArrayList<>();

    static public void insereAluno(Aluno a) {
        aluno.add(a);
    }

    static public String buscaAluno(long ra) {
        String alunos = "";
        for (Aluno a : aluno) {
            if (a.getRa() == ra) {
                alunos = a.imprimirDadosAluno();
                break;
            } else {
                alunos = "Aluno não cadastrado!";
            }
        }
        return alunos;
    }

    static public String imprimeDadosTodosAlunos() {
        String alunos = "";
        for (Aluno a : aluno) {
            alunos += a.imprimirDadosAluno() + "\n";
        }
        return alunos;
    }

    static public void salvaTodosAlunos() {

        RandomAccessFile rm;

        try {
            rm = new RandomAccessFile(new File("aluno.txt"), "rw");

            for (Aluno a : aluno) {

                byte x1[] = (String.valueOf(a.getNome() + "\r\n").getBytes());
                rm.write(x1);

                byte x2[] = (String.valueOf(a.getCpf() + "\r\n").getBytes());
                rm.write(x2);

                byte x3[] = (String.valueOf(a.getRa() + "\r\n").getBytes());
                rm.write(x3);

                byte x4[] = (String.valueOf(a.getCurso() + "\r\n").getBytes());
                rm.write(x4);
            }
            rm.close();
        } catch (FileNotFoundException e) {
            System.out.println("File not found exception");
        } catch (IOException e) {
            System.out.println("IO Exception");
        }
    }

    // o que eu estou fazendo !? 
    static public String leTodosAlunos() {

        String nome = "";
        String cpf = "";
        long ra = 0;
        String curso = "";

        try {

            RandomAccessFile read = new RandomAccessFile(new File("aluno.txt"), "r");
            for (Aluno a : aluno) {
                
    
            }

        } catch (FileNotFoundException e) {
            System.out.println("Arquivo não encontrado.");
        } catch (IOException ex) {
       
        }

        return imprimeDadosTodosAlunos();
    }
}

Na classe GerenciaAlunos:

  • Construa um construtor que recebe uma List alunos, que serão os alunos que você vai gerenciar. De onde eles vem pouco importa, mas a classe porém precisa de um para funcionar.

  • A maioria dos métodos que você colocou na classe GerenciaAlunos não tratam com a ArrayList Aluno que você criou. Fora o método insereAluno(), todos os outros fazem muito mais soque manipular uma coleção de alunos.

  • Por exemplo, o método buscaAlunos(long ra), se ele, como o nome diz, busca um aluno pelo seu registro, deveria devolver um aluno, e não uma String. Fora a chamada a imprimirDadosAluno(). O contrato do método diz, me devolva um aluno com o seguinte ra, muito coisa escondida é feita, e um aluno nunca é devolvido.

  • Se o método imprimeDadosTodosAlunos(), imprime dados de todos os alunos, pq devolve uma String?

  • O método salvaTodosAlunos, salva todos os alunos onde? refatore para uma outra classe, que vai receber a List e salvar, onde quer que seja.

  • O grande “mistério” é aqui. O método leTodosAlunos(). Tire-o dessa classe assim como o método salvaTodosAlunos(), ele deve ler de “algum lugar” e devolver uma List para a classe GerenciaAlunos.

  • Não é de responsabilidade da classe GerenciaAluno imprimir, ler ou salvar. Mas sim, adicionar um novo aluno, buscar um aluno por determinado parâmetro, ou remover um aluno.

Bom, é isso, espero que tenha ajudado.

1 curtida