[RESOLVIDO] Atualizar arraylist dados de um TXT

9 respostas
long

Estou tentando atualizar um arraylist que lê um TXT, quando inicio o programa ele chama o metodo e lê tranquilo mas quando salvo uma nova linha quando peço para listar novamente ele continua com a lista anterior e mais a nova lista

public class Inicio extends javax.swing.JFrame {

    private List<Relogio> lista = new ArrayList<>();
    private Relogio relogio = new Relogio();
    private acessarBD acesso = new acessarBD();
    
    
    public Inicio() {
        initComponents();
        lista = acesso.ler();
    }

private void jButtonSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                              
        
        String entradaTF = jTextFieldEntrada.getText();
        String saidaAlmTF = jTextFieldSaidaAlmoco.getText();
        String retornoAlmTF = jTextFieldRetornoAlmoco.getText();
        String saidaTF = jTextFieldSaida.getText();
        String dataTF = jTextFieldData.getText();
                
        List<Integer> horarioMinutos = relogio.tramsformaMinuto(entradaTF, saidaAlmTF, retornoAlmTF, saidaTF);
        
        List<Integer> horarioCalculado = relogio.calculaCargaHorario(horarioMinutos);
        
        List<String> diaria = relogio.formataTempo(horarioCalculado);
        
        try {
               acesso.inserir(horarioMinutos.get(0), horarioMinutos.get(1), horarioMinutos.get(2), horarioMinutos.get(3), horarioCalculado.get(0), horarioCalculado.get(2), dataTF);
               System.out.println("Salvo");
            } catch (IOException ex) {
                Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
            }
        
    }                                             

    private void jButtonListarActionPerformed(java.awt.event.ActionEvent evt) {       
        if(lista.isEmpty()){
            System.out.println("Zerado");
        }
        System.out.println("Tamanho da lista: " + lista.size());
        for (int i = 0; i < lista.size(); i++) {
            
            System.out.println(lista.get(i).getEntradaM() + "," + lista.get(i).getSaidaAlmocoM() + "," + lista.get(i).getRetornoAlmocoM() + "," + lista.get(i).getSaidaM() + "," + lista.get(i).getTempoTrabalhadoM() + "," + lista.get(i).getTempoRestanteM() + "," + lista.get(i).getData());
            
        }
        lista.clear();
    }

Gostaria que quando eu iniciasse o programa, leria o TXT e salvasse no arraylist para eu manipular, depois se eu salvasse um novo dado o arraylist zeraria e chamava o metodo ler() da classe acessarBD() novamente para atualizar a minha lista.

9 Respostas

ViniGodoy

Posta aqui o método onde você grava o .txt. Não temos como adivinhar o que você fez sem você mostrar o código…

long

Nao postei pq pensava que só com o que passei já ajudaria mas aqui o gravar e o ler TXT

public class acessarBD {
    
    String arquivo = "horario.txt";
    List<String> dados = new ArrayList<>();
    List<Relogio> lista = new ArrayList<>();
    
    
    
    public void inserir(int entrada, int saidaAlmoco, int retornoAlm, int saida, int tempoTrab, int tempoRestante, String data) throws IOException{
        try {
            OutputStream os = new FileOutputStream(arquivo, true);
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);
            
            bw.write(entrada + "," + saidaAlmoco + "," + retornoAlm + "," + saida + "," + tempoTrab + "," + tempoRestante + "," + data);
            bw.newLine();
            
            bw.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(acessarBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public List<Relogio> ler(){
        
        boolean arqExistente = new File(arquivo).exists();
        
        if(arqExistente){
        try {
            InputStream is = new FileInputStream(arquivo);
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            
            String str;
            
            while((str = br.readLine()) != null){
                if(str != null && !str.isEmpty()){
                    dados.add(str);
                }
            }
            
            for(String aux : dados){
                Relogio dadosRelogio = new Relogio();
                String[] dadosRecebidos = aux.split(",");
                
                dadosRelogio.setEntradaM(Integer.parseInt(dadosRecebidos[0]));
                dadosRelogio.setSaidaAlmocoM(Integer.parseInt(dadosRecebidos[1]));
                dadosRelogio.setRetornoAlmocoM(Integer.parseInt(dadosRecebidos[2]));
                dadosRelogio.setSaidaM(Integer.parseInt(dadosRecebidos[3]));
                dadosRelogio.setTempoTrabalhadoM(Integer.parseInt(dadosRecebidos[4]));
                dadosRelogio.setTempoRestanteM(Integer.parseInt(dadosRecebidos[5]));
                dadosRelogio.setData(dadosRecebidos[6]);
                
                lista.add(dadosRelogio);
                
            }
            
        } catch (FileNotFoundException ex) {
            Logger.getLogger(acessarBD.class.getName()).log(Level.SEVERE, null, ex);
            }
          catch (IOException ex) {
            Logger.getLogger(acessarBD.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        return lista;
    }
   
}
ViniGodoy

Nossa, que código bagunçado. Não seria melhor criar uma classe para representar o que está disperso nos arrays de horario?

O seu problema é que você está só fazendo append no arquivo. Em momento nenhum você está mandando o arquivo zerar. O ideal é fazer o seguinte:

  1. Leia todos os dados do arquivo num arrayList.
  2. No seu programa, trabalhe apenas com esse ArrayList;
  3. Na hora de salva, não passe true no segundo parâmetro do FileInputStream, e salve o ArrayList inteiro, sempre, toda vez.
long

Realmente esta bagunçado mas não consegui arruma-lo, poderia da um exemplo?

É mais facil usar um arrayList do tipo String mesmo e depois quebra-lo ou do tipo Relogio?

Entendi o que voce quis dizer mas poderia me explicar o por que?

ViniGodoy

O segundo parâmetro como true no FileInputStream indica que você quer fazer “append” no arquivo, ou seja, adicionar dados ao final.

Se você quer substituir conteúdo, não pode passar esse parâmetro. Tem que apagar o arquivo e gravar tudo de novo.

ViniGodoy

Melhor criar um ArrayList<Relogio> e o método inserir gravar o ArrayList inteiro de uma vez.

long

Refiz tentando seguir a ideia do Vini..

public class Inicio extends javax.swing.JFrame {

    private List<Relogio> lista = new ArrayList<>();
    
    private acessarBD acesso = new acessarBD();
    
    
    public Inicio() {
        initComponents();
        carregarLista();
        
    }

private void jButtonSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                              
        Relogio relogio = new Relogio();       
        
        String entradaTF = jTextFieldEntrada.getText();
        String saidaAlmTF = jTextFieldSaidaAlmoco.getText();
        String retornoAlmTF = jTextFieldRetornoAlmoco.getText();
        String saidaTF = jTextFieldSaida.getText();
        String dataTF = jTextFieldData.getText();
                
        List<Integer> horarioMinutos = relogio.tramsformaMinuto(entradaTF, saidaAlmTF, retornoAlmTF, saidaTF);
        
        relogio.setEntradaM(horarioMinutos.get(0));
        relogio.setSaidaAlmocoM(horarioMinutos.get(1));
        relogio.setRetornoAlmocoM(horarioMinutos.get(2));
        relogio.setSaidaM(horarioMinutos.get(3));
        relogio.setData(dataTF);
        
        if(!lista.isEmpty()){
            horarioMinutos.add(lista.get(lista.size()-1).getTempoRestanteM());
        }
                        
        List<Integer> horarioCalculado = relogio.calculaCargaHorario(horarioMinutos);
        
        relogio.setTempoTrabalhadoM(horarioCalculado.get(0));
        relogio.setTempoRestanteM(horarioCalculado.get(2));
                
        lista.add(relogio);        
        try {    
            
               acesso.inserir(lista);
               System.out.println("Salvo");
               
        } catch (IOException ex) {
                Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }                    

public void carregarLista(){
        
        try {
            
            lista = acesso.ler();
            
        } catch (IOException ex) {
            Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
public class acessarBD {
    
    String arquivo = "horario.txt";    
    List<Relogio> lista = new ArrayList<>();
    //Relogio dado = new Relogio();
    
    
    public void inserir(List<Relogio> dados) throws IOException{
        
        try {
            OutputStream os = new FileOutputStream(arquivo);
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);
            
            for (int i = 0; i < dados.size(); i++) {
                
                bw.write(dados.get(i).getEntradaM() + "," + dados.get(i).getSaidaAlmocoM() + "," + dados.get(i).getRetornoAlmocoM() + "," + dados.get(i).getSaidaM() + "," + dados.get(i).getTempoTrabalhadoM() + "," + dados.get(i).getTempoRestanteM() + "," + dados.get(i).getData());
                bw.newLine();                
            }
            
            bw.close();
                
        } catch (FileNotFoundException ex) {
            Logger.getLogger(acessarBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    public List<Relogio> ler() throws IOException{
        Relogio dado = new Relogio();
        try {
            InputStream is = new FileInputStream(arquivo);
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            
            String str;
            while((str = br.readLine()) != null){
                if(str != null && !str.isEmpty()){
                    String[] aux = str.split(",");
                    
                    dado.setEntradaM(Integer.parseInt(aux[0]));  
                    dado.setSaidaAlmocoM(Integer.parseInt(aux[1]));  
                    dado.setRetornoAlmocoM(Integer.parseInt(aux[2]));  
                    dado.setSaidaM(Integer.parseInt(aux[3]));  
                    dado.setTempoTrabalhadoM(Integer.parseInt(aux[4]));  
                    dado.setTempoRestanteM(Integer.parseInt(aux[5]));  
                    dado.setData(aux[6]);  
                }
                lista.add(dado);
                System.out.println(dado.getEntradaM() + "," + dado.getSaidaAlmocoM() + "," + dado.getRetornoAlmocoM() + "," + dado.getSaidaM() + "," + dado.getTempoTrabalhadoM() + "," + dado.getTempoRestanteM() + "," + dado.getData());
            }
            
            
        } catch (FileNotFoundException ex) {
            Logger.getLogger(acessarBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return lista;
    }
   
}

Alguma ideia do que posso fazer para simplificar mais o codigo ou algo do tipo?

ViniGodoy

Você pode reescrever o método toString para retornar os campos do csv. Isso vai simplificar o write e println.

Outra coisa é usar o for each no lugar do for normal.

long

Obg pela ajuda Vini irei procurar mais sobre reescrever o metodo toString que ainda nao compreendo mto bem, mas pelo menos ja tenho um norte! =)

Criado 28 de julho de 2014
Ultima resposta 29 de jul. de 2014
Respostas 9
Participantes 2