Tenho um projeto Dicionario, para adicionar termos em uma interface com lista, só que preciso que esses dados listados na tabela sejam adicionado em um arquivo txt, como proceder?

//Metodo que salvo na table da interface

private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) {
// Botão salvar
Dicionario d = new Dicionario();

    d.setNumTermo(Integer.parseInt(tfdnumTermo.getText()));
    d.setTermo(tfdTermo.getText());
    d.setSignificado(tfdSignificado.getText());
    d.setFonte(tfdFonte.getText());
    
    if (cd.salvar(d)) {
        JOptionPane.showMessageDialog(null, "Termo cadastrado com sucesso!");
        tfdnumTermo.setText("");
        tfdTermo.setText("");
        tfdSignificado.setText("");
        tfdFonte.setText("");
        tfdnumTermo.requestFocus();
    } else {
        JOptionPane.showMessageDialog(null, "Erro ao cadastrar o termo!");
    }
    d.listarTxt();
}           

//função que criei para listar no txt, ele lista somente o ultimo termo adicionado na table

public void listarTxt(){
Path path = Path.of(“C:\Users\User\Documents\NetBeansProjects\MeuDicionario\arquivo.txt”);
try {
if(Files.notExists(path)){
Files.createFile(path);
}
String texto = this.numTermo + “;” + this.termo + “;” + this.significado + “;” + this.fonte + “;”;
Files.writeString(path, texto);
} catch (IOException ex) {
java.util.logging.Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
}
}

Para concatenar ao final do arquivo, você precisa passar um OpenOption para fazer o APPEND, dessa forma:

Files.writeString(path, texto, StandardOpenOption.WRITE, StandardOpenOption.APPEND);
1 curtida

Sabe alguma forma de eu poder ler os arquivos desse mesmo txt para a minha lista?

private void btnListarActionPerformed(java.awt.event.ActionEvent evt) {
// Botão listar
Dicionario d = new Dicionario();
d.lerTxt();
exibeDicionario();
}

public void lerTxt(){
try{
FileReader f = new FileReader(“arquivo.txt”);
BufferedReader b = new BufferedReader(f);

        String linha = b.readLine();
        String usearray[] = linha.split(";");
        int numTermo = usearray[0]; //retorna erro sobre ser int
        termo = usearray[1];
        significado = usearray[2];
        fonte = usearray[3];            
    } catch (IOException e){
        
    }
}

Usa o Integer.parseInt

mesmo assim ele acaba não lendo as linhas do txt para listar no jtable.

No seu código você está lendo apenas uma linha do arquivo.

estou usando o split para separar por “;” para cada coluna da lista pegar o valor separado por “,”

Sim, mas imagino que seu arquivo contenha diversas linhas.
Cada objeto do tipo Dicionario você salva no arquivo como sendo uma nova linha, certo?
Entretanto você só faz um readLine(), ou seja, só está lendo a primeira linha do arquivo.

Eu se fosse você mudaria o nome da sua classe para Termo, pois é isso que cada instância dela representa, um termo e seu significado.
A classe Dicionario deveria encapsular uma lista de Termo, dessa forma, ao ler o seu arquivo, você iria carregar um List<Termo>, onde cada elemento do tipo Termo representa uma linha do seu arquivo.

1 curtida

@staroski na verdade meu arquivo esta sendo salvo somente em uma linha e cada elementos separado por um “;” ex: 1;1;1… readLine() que usei seria pra ler essa linha toda, mas como faço para que o primeiro 1 vá para a coluna numeroTermo, segundo 1 vá para coluna termo etc…

public void lerTxt(){
try{
FileReader f = new FileReader(“arquivo.txt”);
BufferedReader b = new BufferedReader(f);

        String linha = b.readLine();
        String usearray[] = linha.split(";");
        
        termo = usearray[1];
        significado = usearray[2];
        fonte = usearray[3];
    } catch (IOException e){
        
    }
}

Eu recomendo salvar cada registro em uma linha diferente, senão você vai ter que implementar uma forma de controle para ficar iterando cada x colunas.

String texto = this.numTermo + “;” + this.termo + “;” + this.significado + “;” + this.fonte + “;”;
Já tentei usar o /n para quebrar linha mas sem sucesso, como consigo quebrar a linha?

String texto = this.numTermo + “;” + this.termo + “;” + this.significado + “;” + this.fonte + “; \n”;
Files.writeString(path, texto, StandardOpenOption.WRITE, StandardOpenOption.APPEND);

Deu certo agora, cada linha quebrado, como posso fazer a leitura de cada linha e jogar em cada coluna especifica?

Como você já está fazendo, mas você vai repetir a chamada do readLine() até retornar null


Não consigor usar a variavel numTermo pq ela é int, e não entendi se eu terei que usar o nome da coluna ou uma variavel criada como esse numTermo, termo que estão definidas em outra classe!

pra salvar estou salvando com o nome da coluna:
d.setNumTermo(Integer.parseInt(tfdnumTermo.getText()));
d.setTermo(tfdTermo.getText());
d.setSignificado(tfdSignificado.getText());
d.setFonte(tfdFonte.getText());

Seu array é de String então tem que usar o Integer.parseInt para converter o elemento do seu array para int.

//Ele esta em um loop infinito, e lendo somente a primeira linha
public void lerTxt(){
try{
FileReader f = new FileReader(“C:\Users\User\Documents\NetBeansProjects\MeuDicionario\arquivo.txt”);
BufferedReader b = new BufferedReader(f);

        String linha = b.readLine();
        String usearray[] = linha.split(";");
        
        while(linha != null){
            System.out.println(usearray[0]);
        }
        
    } catch (IOException e){
        
    }
}

Dentro desse loop nunca estás a alterar o valor da tua variável linha, logo nunca vai sair do loop. Tens de ler a linha seguinte antes de verificar novamente se a (nova) linha é null.

while(linha != null){
   System.out.println(usearray[0]);
   linha = b.readLine();
}