Ajuda com ObjectOutputStream

15 respostas
E

Já li diversos tópicos do GUJ, sendo que em todas as vezes a minha dúvida era esclarecida, mas dessa vez eu não consegui encontrar a soluçao para o meu problema, por favor, se alguém puder me auxiliar agradeço :D
No programa em que estou trabalhando, preciso gravar objetos em um arquivo, para que mesmo depois do programa ser fechado, eu possa trabalhar com os dados uma vez foram inseridos. Eu fiz isso usando o Object(Output/Input)Stream, mas quando eu mando gravar, ele apaga o objeto já gravado(se tiver) e grava o novo registro, isto é, grava em cima do que já estava gravado, em vez de somente gravar. Com isso, eu só consigo trabalhar com os dados do último objeto registrado. Por favor, como posso fazer com que o programa grave sem apagar o objeto que já estava gravado? A seguir está o trecho do código:

public static void gravacao(Objeto umobjeto){
        
        ObjectOutputStream out = null;
        
        try {

            out = new ObjectOutputStream(new FileOutputStream("Lista.txt"));
            out.writeObject(umObjeto);
            out.flush();
            out.close();
        } catch (IOException ex) {
            System.out.println("Não foi possível gravar");
            Logger.getLogger(Serializacao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

15 Respostas

marciorodr0
Edu Kenji:
Já li diversos tópicos do GUJ, sendo que em todas as vezes a minha dúvida era esclarecida, mas dessa vez eu não consegui encontrar a soluçao para o meu problema, por favor, se alguém puder me auxiliar agradeço :D No programa em que estou trabalhando, preciso gravar objetos em um arquivo, para que mesmo depois do programa ser fechado, eu possa trabalhar com os dados uma vez foram inseridos. Eu fiz isso usando o Object(Output/Input)Stream, mas quando eu mando gravar, ele apaga o objeto já gravado(se tiver) e grava o novo registro, isto é, grava em cima do que já estava gravado, em vez de somente gravar. Com isso, eu só consigo trabalhar com os dados do último objeto registrado. Por favor, como posso fazer com que o programa grave sem apagar o objeto que já estava gravado? A seguir está o trecho do código:
public static void gravacao(Objeto umobjeto){
        
        ObjectOutputStream out = null;
        
        try {

            out = new ObjectOutputStream(new FileOutputStream("Lista.txt"));
            out.writeObject(umObjeto);
            out.flush();
            out.close();
        } catch (IOException ex) {
            System.out.println("Não foi possível gravar");
            Logger.getLogger(Serializacao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Sugiro gerar o nome do arquivo que você está gravando de acordo com o hashCode do objeto...

Se você mantiver sempre o mesmo arquivo, ele será sobrescrito...

E

Não entendi o que você quis dizer, poderia me explicar de outra forma por favor?

rogelgarcia

Se voce quer ir adicionando objetos no mesmo arquivo… tenta isso:

out = new ObjectOutputStream(new FileOutputStream("Lista.txt", true));
E

Muito obrigado rogelgarcia, agora ele está gravando corretamente. O problema é que agora ele não consegue ler o arquivo Lista.txt quando eu fecho a janela. Qual seria o problema? Segue abaixo o meu método de leitura:

public static Objeto leitura() {

        ObjectInputStream in = null;         

        try {
            in = new ObjectInputStream(new FileInputStream("Lista.txt"));
            Objeto umObjeto = (Objeto) in.readObject();

            System.out.println("Leu");

            //int i = in.read();
            //System.out.println(i);

            return umObjeto;

         } catch (Exception e) {
             System.out.println("Não foi possível ler");
             return null;
         }
    }
E

Esqueçam, achei o problema, ele não conseguia fazer o in.read() do comentario (alias, não entendi o por que). Mas agora vem a parte que eu estou com muita dúvida: como eu faço para ler o próximo objeto? Quando eu chamo o método leitura ele sempre le apenas o 1º objeto…

rogelgarcia

Chama o método várias vezes

E

Mas quando eu chamo o método de novo, ele lê de novo o mesmo objeto!! Como faço para ele ler o próximo? Eu já tentei colocar um loop na leitura() pra ir lendo até dar EOFException, mas ele não consegue ler duas vezes, isto é, le uma vez, mas dps quando le de novo dah uma exceção!! Outra, o in.read() não devia me retornar um int que indique quantoas objetos ainda não foram lidos? Obrigado pela atenção.

rogelgarcia

Poe o código que vc fez pra ler várias vezes aqui

E

Está aí:

public static void leitura() throws IOException {

        ObjectInputStream in = null;
        boolean oef = false;
        Objeto umObjeto = null;
          
        in = new ObjectInputStream(new FileInputStream("Lista.txt"));

         while (oef == false) {
            try {
            
                umObjeto = (Objeto) in.readObject();
                System.out.println("Leu");

                umList.add(umObjeto)
                System.out.println("Adicionou");            
                
            }  catch (EOFException  eofException) {
                 System.out.println("Terminou de ler");
                 in.close();
                 break;
            } catch (Exception e) {
                 System.out.println("Não foi possível ler");
                 in.close();
                 break;
            }
        }

        in.close();
    }
rogelgarcia

É… nao to vendo nada errado nao… :?

E

Alguém poderia me dizer para que serve esse true??

out = new ObjectOutputStream(new FileOutputStream("Lista.txt", true));
renanedpedroso

Acho que isso vai te ajudar com o true…

http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileOutputStream.html

E

Muito obrigado, agora entendi o por que desse boolean :wink:
Mas assim: se esse boolean serve para falar se você quer que o objeto seja gravado no início ou no final do arquivo, então se eu deixar como false, devia gravar no início não é?? Mas se eu deixo como false, ele grava em cima do que estava lá antes gravado… :frowning:
Alguém poderia me ajudar nisso por favor?

rogelgarcia

Nao… o true nao serve pra falar se quer salvar no inicio ou no final…

O true quer dizer… adiciona ao final do arquivo

false (default) quer dizer, sobrescreve o arquivo

E

Perdão, me equivoquei(é que como o true era o final do arquivo, eu supus que o false seria no inicio… :lol:)
Mas quanto à dúvida ainda permane: não entendo como ele não consegue ler todos os objetos do arquivo… :cry:

Criado 21 de março de 2010
Ultima resposta 23 de mar. de 2010
Respostas 15
Participantes 4