Trabalhando com arquivos

19 respostas
R

A nível de aprendizado dos principais conceitos, vou iniciar o desenvolvimento de uma simples agenda de nomes e telefones.

Obviamente preciso salvar os contatos em algum lugar.
Consegui fazer salvando em um arquivo txt, porém não achei muito viável. Dessa forma a separação de cada contato ia ser feita por linhas no txt.
linha 1: contato 1
linha 2: telefone 1
linha 3: contato 2
linha 4 telefone 2

Exceto utilizando banco de dados, gostaria de saber se existe uma maneira melhor de salvar cada contato dessa agenda.

19 Respostas

B

Ola,

Vc tem uma classe que represente estes contatos. não tem?!

Serializa ela mesmo, ou guarde tudo num Map da vida e o serialize, sem converter nada pra texto…

R

Falou grego mas vou dar uma lida sobre o que você disse.

B

Simples, ao inves de vc passar tudo para um string pra salvar em txt, vc deve ter uma lista de Contato, por exemplo… só vc salvar a lista, não precisa passar pra texto.

Ex.:

//considere que vc tem uma classe Contato

public class Contato implements Serializable{
  private String nome;
  private String tel1;
  ...//outras coisas... os getters e setters
}

...//em outro lugar qq
public void salvar(List<Contato> contatos){
  FileOutputStream fos = new FileOutputStream("t.tmp"); // passe aqui o caminho para o arquivo
  ObjectOutputStream oos = new ObjectOutputStream(fos);
  oos.writeObject(contatos);
  oos.close();
}

Depois para recuperar é mole: public List<Contato> recupera(){ FileInputStream fis = new FileInputStream("t.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); List<Contato> contatos = (List<Contato>) ois.readObject(); ois.close(); return contatos; } E pronto.

R

Estou estudando aqui BrunoCarlo, valeu!

R

Pessoal,

Como corrigir esse warning que o eclipse está gerando?

B

O eclipse recomenda que toda classe serializable tenha um serialversion explicito… pois este numero é gerado pelo compilador quando não está declarado…

Manda ele gerar um serial pra vc, e o warning acaba, ou vc vai mas prorpiedades do seu projeto e configura para não dar warning… mas eu prefiro pedir a ele pra gerar.

R

E para que serve esse serialversion BrunoCarlo?

Outra coisa, qual a diferença entre:

  • Add default serial versionID
  • Add generated serial versionID
    ?

Mais uma…
No meu código, tenho as duas linhas

File arquivo = new File ("contatos.txt"); String arq = "contatos.txt";

Porém se eu elimino a primeira linha acima, ele cria o arquivo CONTATOS.TXT da mesma forma.
Vale a pena manter a primeira linha?

Obrigado!

B

rafaeU:
E para que serve esse serialversion BrunoCarlo?

Outra coisa, qual a diferença entre:

  • Add default serial versionID
  • Add generated serial versionID
    ?

Mais uma…
No meu código, tenho as duas linhas

File arquivo = new File ("contatos.txt"); String arq = "contatos.txt";

Porém se eu elimino a primeira linha acima, ele cria o arquivo CONTATOS.TXT da mesma forma.
Vale a pena manter a primeira linha?

Obrigado!

Este serial version é um numero usado pela JVM para identificar a versao de um .class, +/- assim, vc cria uma classe e poe lá alguns aributos, quando compila e não declara um serialversion, o compilador gera este numero, dae quando vc altera algo nesta classe, tipo, adiciona um novo atributo, e compila novamente, o serialversion será diferente do primerio… +/- parecido com o hashCode da classe…

  • Add default serial versionID -> o default se naõ me engano é -1
  • Add generated serial versionID -> o gerador vai gerar um numero, baseado nas informações da classe… é mais confiável.

Em relação as linhas… bom, na primeira vc só cria uma instancia de um File, isto não quer dizer que vc criou um file… a classe file pode referenciar um arquivo no FS, mas é mais uma referencia do que um arquivo… dá uma olhada na documentação, vc vai entender muito melhor…

R

Muito obrigado Bruno.

Parabéns pelo conhecimento.

R

Pessoal,

mais uma dúvida que surgiu…

Para ambas as classes, FileOutputStream e ObjectOutputStream existe o método close correspondente.

Já li a documentação, porém não consegui identificar qual a diferença e “qual o close” ideal para esse caso específico.

B

Ola,

No meu exemplo ae e cima… tem a resposta, vc só precisar invokar close de um, no caso o mais alto-nivel.

R

Bruno, percebi que no seu cógido existe o método e, é justamente essa a dúvida.

Porque invocar um e o outro não.

B

rafaeU:
Bruno, percebi que no seu cógido existe o método e, é justamente essa a dúvida.

Porque invocar um e o outro não.

Humm… bom, este método, quando chamado do objeto de nivel mais alto, ele propaga a chamada, saca?
Nivel mais baixo: FileOutputStream
Nivel mais alto : ObjectOutputStream

R

Agora que você explicou eu saquei.

Notei que a escrita do arquivo - devido a eu ter especificado append true como parâmetro - acontece no final, óbvio.

Entretanto, um novo objeto é escrito na mesma linha do anterior.

Não encontrei nas classes FileOutputStream e ObjectOutputStream um método de quebra de linha.

Provavelmente é possível, mas como?

Outra coisa, e mais importante…
Minha idéia é criar uma funcionalidade para buscar algum contato gravado no arquivo.txt.
Na situação atual, os objetos são gravados em modo binário.

Eu consigo mesmo assim buscar o nome de um contato (objeto) gravado no arquivo?

B

Pois é, a classe ObjectOutputStream é para escrita de objetos… então a leitura de um arquivo escrito por ela como txt pode ficar mei inconpreensiva… mas vc pode mandar um writeBytes("\n");

Só lembrando que a leitura destes caras tem que ser feitos na ordem em que foram escritos… por isto te dei a ideia de só escrever o list… dae vc só precisa ler o list…

R

Minha idéia é a seguinte:

Se a busca for por pelo atributo nome, eu “varro” a lista e comparo o nome passado para busca com todos os atributos nome de todos os objetos.

Isso funciona?

B

Sim, funciona

R

OK Bruno.

Vou fazer os testes e qualquer coisa peço mais ajuda aqui.

Valeu!

B

rafaeU:
OK Bruno.

Vou fazer os testes e qualquer coisa peço mais ajuda aqui.

Valeu!

Ok

Criado 14 de julho de 2008
Ultima resposta 17 de jul. de 2008
Respostas 19
Participantes 2