Recuperar List (corretamente) de arquivo

5 respostas
R

PessoALL, vejam se podem me ajudar por gentileza...

Tenho uma Lista de Contatos que salvo em um arquivo.
A PRIMEIRA vez que adiciono Contatos, o método de mostrar todos os contatos funciona perfeitamente. O problema acontece quando preciso RECUPERAR a Lista do arquivo e add novos Contatos no FINAL do arquivo.
Eu até consigo recuperar a Lista e escrever no final, porém preciso escrever no final da LISTA e não no final do ARQUIVO como está ocorrendo.
Do jeito que está, escreve-se diversas Listas no final do arquivo ao invés de Contatos no final da Lista.
Confuso né?
Vai parte do código p/ auxiliar o entendimento.

Tentativa de recuperação da Lista e adição de novos Contatos:
...
case 1: 
					
						ma.recuperaLista(); //aqui aparentemente eu até consigo recuperar a Lista, mas não funciona corretamente
					do {
						cont = new Contatos();
						cont.setNome(JOptionPane.showInputDialog(null, "Nome: ")); 
						cont.setTel(JOptionPane.showInputDialog(null, "Telefone: "));
						listaContatos.add(cont);
						again = JOptionPane.showConfirmDialog(null, "Inserir outro contato?", "CONFIRMAÇÃO", JOptionPane.YES_NO_OPTION);
					} while	(again == JOptionPane.YES_OPTION);
						ma.salvaLista(listaContatos);
						break;
Métodos que trabalham com o arquivo:
public void salvaLista(List<Contatos> contato) throws IOException {
		FileOutputStream salva = new FileOutputStream (ARQ, true);
		ObjectOutputStream salvaObj = new ObjectOutputStream (salva);
		salvaObj.writeObject(contato);
		salvaObj.flush();
		salvaObj.close();
	}
	
	  public List<Contatos> recuperaLista() throws Exception {

		FileInputStream recupera = new FileInputStream(ARQ);
		ObjectInputStream recuperaObj = new ObjectInputStream(recupera);
		List<Contatos> contato = (List<Contatos>) recuperaObj.readObject();
		recuperaObj.close();
		return contato;
	}
Método que varre a Lista depois de recuperada e imprime todos os Contatos:
public void varreContatos(List<Contatos> cont) {
		for (int i=0; i<cont.size(); i++) {
			cont.get(i).imprimeContato();
		}
	}

	public void imprimeContato() {
		System.out.println("Nome: " +nome + "\nTelefone: " +tel + "\n");
	}

Se eu rodar o programa pela segunda vez, mesmo eu adicionando novos contatos, só é exibido os contatos adicionados na primeira vez (quando o arquivo foi criado).

Obrigado!

5 Respostas

fantomas

Oi rafaelU,

Acho que o seu problema é o seguinte: você passou o valor true no último parametro do output dizendo para ADICIONAR bytes no final do arquivo, talvez passando o valor false (escrever os baytes a partir do início do arquivo) resolva seu problema.

System.out.println(“Abraços!”);

R

fantomas:
Oi rafaelU,
Acho que o seu problema é o seguinte: você passou o valor true no último parametro do output dizendo para ADICIONAR bytes no final do arquivo, talvez passando o valor false (escrever os baytes a partir do início do arquivo) resolva seu problema.

Faz sentido, porém fiz essa alteração e gerou novo problema.

Só é exibido os últimos Contatos adicionados.

Alguma coisa está fazendo com que os novos Contatos NÃO sejam adicionados no final da lista.

leoramos

Cara, eu posso estar falando bobagem, mas se eu realmente entendi, tá te falando é atribuir essa lista que tu recuperou a alguém antes de continuar manipulando ela…
Na primeira linha:

ma.recuperaLista(); //aqui aparentemente eu até consigo recuperar a Lista, mas não funciona corretamente

no lugar dessa linha, tenta fazer isso:

listaContatos = ma.recuperaLista();

ou isso:

listaContatos.addAll(ma.recuperaLista();

Acho que vai funcionar.

Abraço!

R

Muito bom leoramos, aparentemente funcionou 100%.

Agora me explica o porque, pois quando eu recuperava a Lista eu já não a tinha?

Pensei que como eu já tinha recuperado, era só inserir novos Contatos.

OBS: Notei que as duas formas que você sugeriu teve o mesmo resultado.

Muito obrigado.

leoramos

É que com o

ma.recuperaLista();

você até recuperava a lista, ela vinha pra memória - até aí tudo bem - só que você não atribuía o retorno (no caso, uma List) ao objeto ‘listaContatos’, mas sim ao objeto ‘ma’.
Eu não sei quais os outros atributos ou mesmo como foi instanciado o objeto ‘ma’, mas é bem possível que se você adicionasse os contatos nesse objeto e não no ‘listaContatos’, você também conseguiria fazer funcionar corretamente. Acho até que é mais correto, assim tu não trabalha com duas listas na memória, e o teu programa vai ficar mais leve.
O que as duas formas que te passei fazem é exatamente isso: pegam a lista que você recuperou e atribuem a mesma ao objeto ‘listaContatos’.
Quem ‘tinha’ a lista era o objeto ‘ma’, e não o ‘listaContatos’, efetivamente… era isso =)
Qualquer dúvida, galera sempre ajuda!

Abraço!

PS: Existe uma diferença nas duas formas, mas que no teu caso, levam ao mesmo resultado. O mais seguro, DISPARADO, é usando o método addAll, com ele com certeza ele pega os itens de uma lista e joga em outra lista, simples assim hehe. Abraço!

Criado 30 de julho de 2008
Ultima resposta 30 de jul. de 2008
Respostas 5
Participantes 3