How do I edit a list of objects within a txt file?

Asked

Viewed 47 times

0

I am doing a job in college for the discipline of OOP in java. In this way it was requested a crud operating files ". txt". I’m having a hard time manipulating the list I put in there. I can provide parts of the code that are missing. But after a lot of research on the internet I saw that the recommended would be:

  1. create a temporary.txt file
  2. remove the original ".txt file"
  3. rename temporary to original name
  4. after this remove the temporary.

That didn’t work.

Man arquivo.txt original with the list I wish to manipulate :

1:Gabriel:123123:16/02/1997:3000.0:200.0:10.0:Gustavo:2345:12/12/1212
2:Rafael:123123:16/02/1997:3000.0:200.0:10.0:Joao:2345:12/12/1212
3:Lucas:123123:16/02/1997:3000.0:200.0:10.0:Joao:2345:12/12/1212
4:Tiago:123123:16/02/1997:3000.0:200.0:10.0:Joao:2345:12/12/1212
5:Jonas:123123:16/02/1997:3000.0:200.0:10.0:Joao:2345:12/12/1212
6:Yago Pikachu:123123:16/02/1997:3000.0:200.0:10.0:Donizette:2345:12/12/1212
7:German Cano:123123:16/02/1997:3000.0:200.0:10.0:Tales Magno:2345:12/12/1212
8:Roberto Dinamite:123123:16/02/1997:3000.0:200.0:10.0:Mauro Galvão:2345:12/12/1212

I know the list is correct in memory in the form of TreeSet because I printed it on the eclipse console before trying to pass it to the ". txt".

My doubt is really on how to manipulate the file because after trying to remove the "original" and "rename" the "temporary" to the "original" name. The following mistake happened :

inserir a descrição da imagem aqui

Here I show a print in the list console just before calling the method that handles the two files.

inserir a descrição da imagem aqui

Code:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDate;
import java.util.TreeSet;

import Model.Pessoa;
import Model.VendedorExterno;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class AtualizarVendedorExternoService extends Application {
    public static Stage atualizarTelaVendedorExternoStage = new Stage();
    TreeSet<VendedorExterno> treeSetvendedor = new TreeSet<VendedorExterno>();

    File arquivo = null;
    File arquivoOrigem = null;
    FileWriter recebearquivo = null;
    BufferedWriter escreve = null;
    FileReader recebearquivoleitura = null;
    BufferedReader leDeArquivo = null;
    String registro = null;

    public static void fecharTela() {
        atualizarTelaVendedorExternoStage.close();
    }

    public void abreUmArquivo() {
        try {
            arquivo = new File("arquivoTemporario.txt");
            recebearquivo = new FileWriter(arquivo, false);
            escreve = new BufferedWriter(recebearquivo);
        } catch (Exception e) {
            System.out.println(" Erro ao tentar abrir arquivo: " + e.getMessage());
        }
    }

    public void gerenciaArquivos() {
        File arquivoOriginal = new File("arquivo.txt");

        System.out.println("\n Gerencía: \n");
        System.out.println(this.treeSetvendedor);
        //arquivoOriginal.delete();
        // Apaga o arquivo original
        if (!arquivoOriginal.delete()) {
            System.out.println("Não foi possivel atualizar o arquivo original");
        }

        if (!this.arquivo.renameTo(arquivoOriginal))
            System.out.println("Não foi possivel finalizar a atualização do arquivo");
    }

    public void fechaUmArquivo() {
        try {
            escreve.close();
            recebearquivo.close();
        } catch (IOException e) {
            System.out.println(" Erro ao tentar fechar o arquivo: " + e.getMessage());
        }
    }

    public void gravaVendedorEmTexto(VendedorExterno v) {
        abreUmArquivo();

        try {
            escreve.write(v.toString());
            escreve.newLine();
        } catch (IOException e) {
            System.out.println("Erro ao tentar escrever no arquivo: " + e.getMessage());
        } finally {
            fechaUmArquivo();
        } // do arquivo.
    }

    public void gravaTreeSetDeVendedoresExternosEmTexto() {
        try {
            System.out.println("\n gravar treeset\n ");
            System.out.println(this.treeSetvendedor);
            for (VendedorExterno umVendedorExterno : this.treeSetvendedor) {
                gravaVendedorEmTexto(umVendedorExterno);
            }
            gerenciaArquivos();
            lerVendedores();// Atualiza o treesetVendedor que mantém em memória uma lista simulando a lista
        } catch (Exception e) {
            System.out.println("Erro ao gravar Vendedores em texto" + e.getMessage());
        }
    }

    // Salvar os dados em memória no arquivo
    public void Salvar() {
        System.out.println("Salvar");
        gravaTreeSetDeVendedoresExternosEmTexto();
        lerVendedores();// Atualiza o treesetVendedor que mantém em memória uma lista simulando a lista
    }

    // Este método recebe os paramateros para atualizar em memória o Vendedor e o
    // Cliente do Vendedor.
    public void cadastrarVendedorExterno(int id, String nome, String telefone, String dataDeNascimento, String salario,
                                         String comissao, String ajudaDeCusto, String clienteNome, String clienteTelefone,
                                         String clienteDataDeNascimento) {
        try {
            if (!treeSetvendedor.isEmpty()) {
                VendedorExterno vendedorAux = new VendedorExterno();
                VendedorExterno v2 = new VendedorExterno();
                for (VendedorExterno v : treeSetvendedor) {
                    if (v.getId() == id) {
                        v2 = new VendedorExterno(id, nome, telefone,
                                LocalDate.parse(dataDeNascimento, Pessoa.formatter), Double.parseDouble(salario.trim()),
                                Double.parseDouble(comissao.trim()), Double.parseDouble(ajudaDeCusto.trim()),
                                clienteNome, clienteTelefone,
                                LocalDate.parse(clienteDataDeNascimento, Pessoa.formatter));
                        System.out.println(v.toString());
                        vendedorAux = v;
                        break;
                    }
                }
                System.out.println(this.treeSetvendedor);
                this.treeSetvendedor.remove(vendedorAux);
                this.treeSetvendedor.add(v2);
                System.out.println(this.treeSetvendedor);
                System.out.println("\n fim \n");
            }
        } catch (Exception e) {
            System.out.println("Falha ao tentar cadastrar Vendedor Externo" + e.getMessage());
        }
    }

    public boolean abreUmArquivoLeitura() {
        try {
            arquivo = new File("arquivo.txt");

            if (arquivo.exists()) {
                recebearquivoleitura = new FileReader(arquivo);// fluxo de conexao
                leDeArquivo = new BufferedReader(recebearquivoleitura);
                return true;
            }
        } catch (Exception e) {
            System.out.println(" Erro ao tentar abrir arquivo: " + e.getMessage());
        }
        return false;
    }

    public void fechaUmArquivoLeitura() {
        try {
            leDeArquivo.close();
            recebearquivoleitura.close();
        } catch (IOException e) {
            System.out.println(" Erro ao tentar fechar o arquivo: " + e.getMessage());
        }
    }

    public void lerVendedores() {
        int id;
        String nome;
        String telefone;
        LocalDate dataDeNascimento;
        double salario;
        double comissao;
        double ajudaDeCusto;
        String clienteNome;
        String clienteTelefone;
        LocalDate clienteDataDeNascimento;

        try {
            if (abreUmArquivoLeitura()) {
                while ((registro = leDeArquivo.readLine()) != null) {
                    String[] campos = new String[11];
                    campos = registro.split(":");

                    id = Integer.parseInt(campos[0].trim());
                    nome = campos[1].trim();
                    telefone = campos[2].trim();

                    dataDeNascimento = LocalDate.parse(campos[3].trim(), Pessoa.formatter);
                    salario = Double.parseDouble(campos[4].trim());
                    comissao = Double.parseDouble(campos[5].trim());
                    ajudaDeCusto = Double.parseDouble(campos[6].trim());
                    clienteNome = campos[7].trim();
                    clienteTelefone = campos[8].trim();
                    clienteDataDeNascimento = LocalDate.parse(campos[9].trim(), Pessoa.formatter);

                    treeSetvendedor.add(new VendedorExterno(id, nome, telefone, dataDeNascimento, salario, comissao,
                            ajudaDeCusto, clienteNome, clienteTelefone, clienteDataDeNascimento));
                }
            }
        } catch (FileNotFoundException e) { // tratando quando o arquivo não existe
            System.err.println("Erro: arquivo nao existe. " + arquivo);
        } catch (IOException e) { // tratando quando há erro no readLine()
            System.err.println("Erro na leitura do arquivo: " + arquivo);
        } catch (Exception e) {
            System.out.println("Erro inesperado na leitura do arquivo \n \n  ");
            e.printStackTrace();
        } finally {
            fechaUmArquivoLeitura();
        }
    }

    public String buscarPorId(int id) {
        lerVendedores();
        if (!treeSetvendedor.isEmpty()) {
            for (VendedorExterno v : treeSetvendedor) {
                if (v.getId() == id) {
                    return v.toString();
                }
            }
        }
        return "Nada foi encontrado";
    }

    @Override
    public void start(Stage primaryStage) {
        try {
            Pane root = FXMLLoader.load(getClass().getResource("../View/AtualizarVendedorExterno.fxml"));
            Scene scene = new Scene(root, 660, 400);

            primaryStage.setScene(scene);
            primaryStage.show();
            lerVendedores();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Chama o método start para abrir uma nova janela.
    public void abrirTela() {
        try {
            start(atualizarTelaVendedorExternoStage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Update:

After code changes suggested by Anthony:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDate;
import java.util.TreeSet;

import Model.Pessoa;
import Model.VendedorExterno;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class AtualizarVendedorExternoService extends Application {
    public static Stage atualizarTelaVendedorExternoStage = new Stage();
    TreeSet<VendedorExterno> treeSetvendedor = new TreeSet<VendedorExterno>();

    File arquivo = null;
    File arquivoOrigem = null;
    FileWriter recebearquivo = null;
    BufferedWriter escreve = null;
    FileReader recebearquivoleitura = null;
    BufferedReader leDeArquivo = null;
    String registro = null;

    public static void fecharTela() {
        atualizarTelaVendedorExternoStage.close();
    }

    public void abreUmArquivo() {
        try {
            arquivo = new File("arquivoTemporario.txt");
            recebearquivo = new FileWriter(arquivo, false);
            escreve = new BufferedWriter(recebearquivo);
        } catch (Exception e) {
            System.out.println(" Erro ao tentar abrir arquivo: " + e.getMessage());
        }
    }

    public void gerenciaArquivos() {
        File arquivoOriginal = new File("arquivo.txt");

        System.out.println("\n Gerencía: \n");
        System.out.println(this.treeSetvendedor);
        //arquivoOriginal.delete();
        // Apaga o arquivo original
        if (!arquivoOriginal.delete()) {
            System.out.println("Não foi possivel atualizar o arquivo original");
        }

        if (!this.arquivo.renameTo(new File("arquivo.txt")))
            System.out.println("Não foi possivel finalizar a atualização do arquivo");
    }

    public void fechaUmArquivo() {
        try {
            escreve.close();
            recebearquivo.close();
        } catch (IOException e) {
            System.out.println(" Erro ao tentar fechar o arquivo: " + e.getMessage());
        }
    }

    public void gravaVendedorEmTexto(VendedorExterno v) {
        try {
            escreve.write(v.toString());
            escreve.newLine();
        } catch (IOException e) {
            System.out.println("Erro ao tentar escrever no arquivo: " + e.getMessage());
        }
    }

    public void gravaTreeSetDeVendedoresExternosEmTexto() {
        try {
            abreUmArquivo();
            System.out.println("\n gravar treeset\n ");
            System.out.println(this.treeSetvendedor);
            for (VendedorExterno umVendedorExterno : this.treeSetvendedor) {
                gravaVendedorEmTexto(umVendedorExterno);
            }
            gerenciaArquivos();
            lerVendedores();// Atualiza o treesetVendedor que mantém em memória uma lista simulando a lista

        } catch (Exception e) {
            System.out.println("Erro ao gravar Vendedores em texto" + e.getMessage());
        } finally {
            fechaUmArquivo();
        } // do arquivo.
    }

    // Salvar os dados em memória no arquivo
    public void Salvar() {
        System.out.println("Salvar");
        gravaTreeSetDeVendedoresExternosEmTexto();
        lerVendedores();// Atualiza o treesetVendedor que mantém em memória uma lista simulando a lista
    }

    // Este método recebe os paramateros para atualizar em memória o Vendedor e o
    // cliente do Vendedor.
    public void cadastrarVendedorExterno(int id, String nome, String telefone, String dataDeNascimento, String salario,
                                         String comissao, String ajudaDeCusto, String clienteNome, String clienteTelefone,
                                         String clienteDataDeNascimento) {
        try {
            if (!treeSetvendedor.isEmpty()) {
                VendedorExterno vendedorAux = new VendedorExterno();
                VendedorExterno v2 = new VendedorExterno();
                for (VendedorExterno v : treeSetvendedor) {

                    if (v.getId() == id) {
                        v2 = new VendedorExterno(id, nome, telefone,
                                LocalDate.parse(dataDeNascimento, Pessoa.formatter), Double.parseDouble(salario.trim()),
                                Double.parseDouble(comissao.trim()), Double.parseDouble(ajudaDeCusto.trim()),
                                clienteNome, clienteTelefone,
                                LocalDate.parse(clienteDataDeNascimento, Pessoa.formatter));
                        System.out.println(v.toString());
                        vendedorAux = v;
                        break;
                    }
                }
                System.out.println(this.treeSetvendedor);
                this.treeSetvendedor.remove(vendedorAux);
                this.treeSetvendedor.add(v2);
                System.out.println(this.treeSetvendedor);
                System.out.println("\n fim \n");


            }

        } catch (Exception e) {
            System.out.println("Falha ao tentar cadastrar Vendedor Externo" + e.getMessage());
        }
    }

    public boolean abreUmArquivoLeitura() {
        try {
            arquivo = new File("arquivo.txt");

            if (arquivo.exists()) {
                recebearquivoleitura = new FileReader(arquivo);// fluxo de conexao
                leDeArquivo = new BufferedReader(recebearquivoleitura);
                return true;
            }

        } catch (Exception e) {
            System.out.println(" Erro ao tentar abrir arquivo: " + e.getMessage());
        }
        return false;
    }

    public void fechaUmArquivoLeitura() {
        try {
            leDeArquivo.close();
            recebearquivoleitura.close();
        } catch (IOException e) {
            System.out.println(" Erro ao tentar fechar o arquivo: " + e.getMessage());
        }
    }

    public void lerVendedores() {
        int id;
        String nome;
        String telefone;
        LocalDate dataDeNascimento;
        double salario;
        double comissao;
        double ajudaDeCusto;
        String clienteNome;
        String clienteTelefone;
        LocalDate clienteDataDeNascimento;

        try {
            abreUmArquivoLeitura();

            while ((registro = leDeArquivo.readLine()) != null) {
                String[] campos = new String[11];
                campos = registro.split(":");

                id = Integer.parseInt(campos[0].trim());
                nome = campos[1].trim();
                telefone = campos[2].trim();

                dataDeNascimento = LocalDate.parse(campos[3].trim(), Pessoa.formatter);
                salario = Double.parseDouble(campos[4].trim());
                comissao = Double.parseDouble(campos[5].trim());
                ajudaDeCusto = Double.parseDouble(campos[6].trim());
                clienteNome = campos[7].trim();
                clienteTelefone = campos[8].trim();
                clienteDataDeNascimento = LocalDate.parse(campos[9].trim(), Pessoa.formatter);

                treeSetvendedor.add(new VendedorExterno(id, nome, telefone, dataDeNascimento, salario, comissao,
                        ajudaDeCusto, clienteNome, clienteTelefone, clienteDataDeNascimento));

            }
        } catch (FileNotFoundException e) { // tratando quando o arquivo não existe
            System.err.println("Erro: arquivo nao existe. " + arquivo);
        } catch (IOException e) { // tratando quando há erro no readLine()
            System.err.println("Erro na leitura do arquivo: " + arquivo);
        } catch (Exception e) {
            System.out.println("Erro inesperado na leitura do arquivo \n \n  ");
            e.printStackTrace();
        } finally {
            fechaUmArquivoLeitura();
        }
    }

    public String buscarPorId(int id) {
        lerVendedores();
        if (!treeSetvendedor.isEmpty()) {
            for (VendedorExterno v : treeSetvendedor) {
                if (v.getId() == id) {

                    return v.toString();

                }
            }
        }
        return "Nada foi encontrado";
    }

    @Override
    public void start(Stage primaryStage) {
        try {
            Pane root = FXMLLoader.load(getClass().getResource("../View/AtualizarVendedorExterno.fxml"));
            Scene scene = new Scene(root, 660, 400);

            primaryStage.setScene(scene);
            primaryStage.show();
            lerVendedores();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Chama o método start para abrir uma nova janela.
    public void abrirTela() {
        try {
            start(atualizarTelaVendedorExternoStage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Upshot:

inserir a descrição da imagem aqui inserir a descrição da imagem aqui

Update2:

//Unica mudança
//o método fechaarquivo(); eu removi de finally conforme solictado pelo Anthony Accioly e coloquei pra fechar antes de tentar gerenciar o arquivo.

public void gravaTreeSetDeVendedoresExternosEmTexto() {
        try {
            abreUmArquivo();
            System.out.println("\n gravar treeset\n ");
            System.out.println(this.treeSetvendedor);
            for (VendedorExterno umVendedorExterno : this.treeSetvendedor) {
                gravaVendedorEmTexto(umVendedorExterno);
            }
        
            fechaUmArquivo();
            gerenciaArquivos();
            lerVendedores();// Atualiza o treesetVendedor que mantém em memória 
uma lista simulando a lista

        } catch (Exception e) {
            System.out.println("Erro ao gravar Vendedores em texto" + 
e.getMessage());
        }
    }
  • 1

    Hi Gabriel, could you paste the code instead of posting an image? I can not confirm only with the image you posted, but it seems to me that you are writing one seller at a time, always closing and overwriting the file; that is, at the end you will have a file only with the last seller of TreeSet . Instead you should have a block try catch finally inside gravaTreeSet.. which: 1) opens the file only once before starting the for, 2) writes each seller within the for without closing the file and finally closes the file in the block finally.

  • Okay. I’m going to remove the yams and put in the necessary code. I just haven’t been able to put the things you mentioned in that comment. But I’m gonna change here and put it right away.

  • 1

    Gabriel, post also the arquivo.txt in textual format, if not other people can not test (See How to build a Minimum, Complete, and Verifiable example). It seems that now the temporary file is being generated correctly right? Again I have no way to test without a MVCE, but I believe that the arquivo.txtbe empty because things are happening out of order. That is, you should only perform steps 2 and 3 of your list after you have closed the temporary file.

  • All right, I’ll post.

  • I positioned just below the first image that shows the ".txt file"

  • The temporary file is correct, I did as explained in the first comment. I will still perform this part of closing the temporary file first. I really had not understood it that way.

  • I did as you said and it worked. Thank you very much. I think I now understand my mistake of not closing the file properly.

Show 2 more comments
No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.