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:
publicstaticvoidgravacao(Objetoumobjeto){ObjectOutputStreamout=null;try{out=newObjectOutputStream(newFileOutputStream("Lista.txt"));out.writeObject(umObjeto);out.flush();out.close();}catch(IOExceptionex){System.out.println("Não foi possível gravar");Logger.getLogger(Serializacao.class.getName()).log(Level.SEVERE,null,ex);}}
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:
publicstaticvoidgravacao(Objetoumobjeto){ObjectOutputStreamout=null;try{out=newObjectOutputStream(newFileOutputStream("Lista.txt"));out.writeObject(umObjeto);out.flush();out.close();}catch(IOExceptionex){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
Edu_Kenji
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:
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:
publicstaticObjetoleitura(){ObjectInputStreamin=null;try{in=newObjectInputStream(newFileInputStream("Lista.txt"));ObjetoumObjeto=(Objeto)in.readObject();System.out.println("Leu");//int i = in.read();//System.out.println(i);returnumObjeto;}catch(Exceptione){System.out.println("Não foi possível ler");returnnull;}}
E
Edu_Kenji
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
Edu_Kenji
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
Edu_Kenji
Está aí:
publicstaticvoidleitura()throwsIOException{ObjectInputStreamin=null;booleanoef=false;ObjetoumObjeto=null;in=newObjectInputStream(newFileInputStream("Lista.txt"));while(oef==false){try{umObjeto=(Objeto)in.readObject();System.out.println("Leu");umList.add(umObjeto)System.out.println("Adicionou");}catch(EOFExceptioneofException){System.out.println("Terminou de ler");in.close();break;}catch(Exceptione){System.out.println("Não foi possível ler");in.close();break;}}in.close();}
rogelgarcia
É… nao to vendo nada errado nao… :?
E
Edu_Kenji
Alguém poderia me dizer para que serve esse true??
Muito obrigado, agora entendi o por que desse boolean
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…
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
Edu_Kenji
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…