[RESOLVIDO] Gravar ArrayList em arquivo de texto

8 respostas
cle.darsie

Olá pessoal,

Eu criei um sistema que quando o usuário digita no JTextField, ele pega os valores, e gravam em um ArrayList (fiz o teste e está gravando mesmo).
O que eu estou com problema agora, é que não está salvando o que eu gravei em um arquivo texto. Ele diz que gravou, mas quando eu abro o arquivo, ele está em branco.

Segue o código ai pra vocês darem uma olhada.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JButton;

public class TratadorPanelCad implements ActionListener {
	private PanelCad setar;
	private JButton clean, save, rec, exit;
	private CadAluno cadastro;
	private Aluno aluno;
	private ArrayList<Aluno> fileName;

	public TratadorPanelCad(JButton bLimpar, JButton bAddCad,
			JButton bGravar, JButton bSair, PanelCad setar1) {

		clean = bLimpar;
		save = bAddCad;
		rec = bGravar;
		exit = bSair;
		setar = setar1;
	}
	

	public void actionPerformed(ActionEvent e) {

		if (clean == e.getSource()) { // Limpa os todos os campos da tela de cadastro
			setar.setNome("");
			setar.setCpf("");
			setar.setTel("");
			setar.setEnd("");
			setar.setBairro("");
			setar.setCid("");
			setar.setUf("");
			setar.setCep("");
		}

		if (save == e.getSource()) { // Salva o cadastro em ArrayList
			try {
				cadastro = new CadAluno();
				aluno = new Aluno();

				aluno.setNome(setar.getNome());
				aluno.setCpf(setar.getCpf());
				aluno.setTel(setar.getTel());
				aluno.setEnd(setar.getEnd());
				aluno.setBairro(setar.getBairro());
				aluno.setCid(setar.getCid());
				aluno.setUf(setar.getUf());
				aluno.setCep(setar.getCep());
	
				cadastro.adicionar(aluno);
				
			} catch (IOException ex) {
				ex.printStackTrace();
			}
			setar.setTfield("Aluno adicionado!");
		}

		if (rec == e.getSource()) { //Grava os dados do ArrayList em arquivo .txt
			try {
				setar.fSalvar.show();
				if (setar.fSalvar.getFile() == null)
					return;
				fileName = cadastro.getCadAlunos();
				new FileWriter(fileName.toString());
				setar.setTfield("Gravado com sucesso!");
			} catch (IOException exc) {
				setar.setTfield("Erro ao gravar!");
			}
		}
		
		if (exit == e.getSource()) {
			System.exit(0); // Sai do sistema
		}
	}
}

Alguém consegue ver porque o arquivo fica em branco?

8 Respostas

juliofsn

simples, você está abrindo o FileWriter, mas não está escrevendo nada nele. Use o método write do FileWriter

FileWriter writer = new FileWriter(fileName.toString());
writer.write("texto que você quer salvar");

e depois lembre fechar o FileWriter no finally.

cle.darsie

Agora sim, está gravando algo dentro do arquivo.

Porém está gravando na minha opinião o endereço do ArrayList. E não o conteúdo dele. Está certo isso?
Está ficando assim dentro do arquivo texto: [com.br.sysmap.cadaluno.Aluno@7c6768]

Depois disso, eu quero usar uma outra função que criei para ler o que salvei no arquivo texto e mostrar num JTextArea.
Mas quando eu dou o comando pra mostrar lá, aparece essa mesma mensagem ai de cima, que eu acho que é o endereço.

Alguém sabe o porque disso?

T

Opa, beleza.

O que você está tentando escrever no arquivo ?

monta 1 string com o conteúdo do objeto, tipo:

String conteudo = aluno.getNome() + "; " + aluno.getCpf() . . .;

e depois passa o variavel criada para ser gravada.

Utiliza StringBuffer para criar a variavel conteudo.

juliofsn

Se você manda imprimir um objeto, por padrão é chamado o método toString() dele,
então, por padrão o método toString() de objetos de classes que não tiveram esse método sobrescrito retornam isso mesmo.

Se você quer salvar o conteúdo do ArrayList, tem que criar uma lógica própria pra isso, como o tiralo falou.
Tente formatar o arquivo de uma forma padronizada, como um csv ou xml pra ficar mais fácil pra você ler depois.

cle.darsie

Então, eu tenho uma classe chamada CadAluno, que é onde ficam os métodos de cadastro, tipo, adicionar, remover, listar, buscar e etc.
Tem um método que se chama getCadAlunos(), que é onde ficam todos os alunos cadastrados.

O que eu estou fazendo é: na hora de gravar em arquivo, eu estou dando o seguinte comando:

writer.write(cadastro.getCadAlunos().toString());

Esse comando deveria pegar o que está dentro de getCadAlunos() e gravar no arquivo texto, certo?
Mas não esta acontecendo isso.

Se eu fizer o que o Tiralo falou eu já fiz uma vez, mas não serve pra mim, porque ele não vai gravar o getCadAlunos(), e sim o que está nos JTextFields.

Esse problema está me pegando já faz quase 2 semanas! hahaha.
Está complicado galera. Mas não vou desistir.

T

Opa.

Então o seu metodo getCadAlunos, retorna o q? 1 lista com varios objetos do tipo Aluno, certo ?

Se vc fizer 1 loop, nessa lista e pegar o objeto Aluno, e depois montar a string, dando 1 get nos atributos e para dar certo.

Estou supondo q o retorno do metodo getCadAlunos, seja 1 lista de objetos do tipo Aluno.

Ou sobrescrever o metodo toString da classe Aluno, como o juliofsn sugeriu.

Até mais.

juliofsn

cle.darsie:
O que eu estou fazendo é: na hora de gravar em arquivo, eu estou dando o seguinte comando:

writer.write(cadastro.getCadAlunos().toString());

Esse comando deveria pegar o que está dentro de getCadAlunos() e gravar no arquivo texto, certo?

Errado, esse comando escreve o que vier do método toString() do ArrayList, e por padrão o método toString() do ArrayList retorna aquele texto que você viu.

Você tem duas opções:
criar uma classe que extende de ArrayList e sobrescrever o método toString() para retornar o que você quer, ou criar outro método com a lógica para escrever os valores da lista no arquivo.

Algo como:

for(Aluno a : cadastro.getCadAlunos())
writer.write(a.Nome+";"+a.nota+";"+a.idade+"\n");
cle.darsie
Certo, vou tentar isso daqui a pouco, agora nao to mais conseguindo pensar rsrs..

Obrigado por enquanto amigos..

Aeee Galera, funcionou!!
Agora sim =D
Muuuuito obrigado mesmo!
Espero um dia poder fazer pelos iniciantes o que vcs estao fazendo por mim =D

O problema foi resolvido com aquele simples for.
E o pior, eu antes de fazer o código com interface gráfica, e tinha feito ele em modo de linha de comando, e usei aquele for também! hehehe

Valeu ai galera!

Segue abaixo como ficou o código..
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JButton;

public class TratadorPanelCad implements ActionListener {
	private PanelCad setar;
	private JButton clean, save, rec, exit;
	private CadAluno cadastro;
	private Aluno aluno;
	private String fileName;

	public TratadorPanelCad(JButton bLimpar, JButton bAddCad, JButton bGravar, 
							JButton bSair, PanelCad setar1) {

		clean = bLimpar;
		save = bAddCad;
		rec = bGravar;
		exit = bSair;
		setar = setar1;
	}
	
	public void limparTela(){
		setar.setNome("");
		setar.setCpf("");
		setar.setTel("");
		setar.setEnd("");
		setar.setBairro("");
		setar.setCid("");
		setar.setUf("");
		setar.setCep("");
		setar.setTfield("Tela Limpa");
	}

	public void adicionarAluno(){
		cadastro = new CadAluno();
		aluno = new Aluno();
		
		aluno.setNome(setar.getNome());
		aluno.setCpf(setar.getCpf());
		aluno.setTel(setar.getTel());
		aluno.setEnd(setar.getEnd());
		aluno.setBairro(setar.getBairro());
		aluno.setCid(setar.getCid());
		aluno.setUf(setar.getUf());
		aluno.setCep(setar.getCep());

		try {
			cadastro.adicionar(aluno);
		} catch (IOException e) {
			e.printStackTrace();
		}
		setar.setTfield("Aluno Adicionado!");
	}
	
	public void gravarArquivo(){
		try {
			setar.fSalvar.show();
			if (setar.fSalvar.getFile() == null)
				return;
			fileName = setar.fSalvar.getDirectory() + setar.fSalvar.getFile();
			FileWriter writer = new FileWriter(fileName);
			for(Aluno aluno : cadastro.getCadAlunos())  
				writer.write("Nome: " + aluno.getNome() + "\nCPF: " + aluno.getCpf() +
						  "\nTelefone: " +aluno.getTel()+ "\nEndereço: " + aluno.getEnd() +
						  "\nBairro: " + aluno.getBairro()+ "\nCidade: " + aluno.getCid() +
						  "\nUF: " + aluno.getUf() + "\nCEP: " + aluno.getCep());  
			
			writer.close();
			setar.setTfield("Arquivo Salvo!");
		} catch (IOException exc) {
			setar.setTfield("Erro ao gravar!");
		}
	}
	
	public void actionPerformed(ActionEvent e) {
		if (clean == e.getSource()) { // Limpa os todos os campos da tela de cadastro
			limparTela();
		}
		if (save == e.getSource()) { // Salva o cadastro em ArrayList
			adicionarAluno();
		}
		if (rec == e.getSource()) { //Grava os dados do ArrayList em arquivo de texto
			gravarArquivo();
		}
		if (exit == e.getSource()) { // Sai do sistema
			System.exit(0); 
		}
	}
}
Criado 4 de abril de 2011
Ultima resposta 4 de abr. de 2011
Respostas 8
Participantes 3