Pessoal não estou conseguindo recuperar os objetos salvos anteriormente em uma arraylist, aparece a exception EOFException.
para gravar na array eu uso esse código:
public class GravarLista {
public void gravaLista(List<Acoes> lista) throws IOException {
OutputStream os = new FileOutputStream("objetos salvos.ser", true);
ObjectOutputStream oos = new ObjectOutputStream(os);
for (Acoes acao : lista) {
oos.writeObject(acao);
}
oos.close();
}
Funciona de boa mais de hora de resgatar os objetos ocorre a exception. Alguem pode me dar uma ajuda do que eu estou fazendo errado nesse código?
publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException{InputStreamis=newFileInputStream("objetos salvos.ser");ObjectInputStreamois=newObjectInputStream(is);ArrayList<Acoes>lista=newArrayList();inti=0;while(ois.readBoolean()){// acho e isso funciona, sei la, nunca usei ObjectInputStreamAcoesacao=(Acoes)ois.readObject();// agora vc cria uma acao e adiciona ao listlista.add(acao);System.out.print(lista.get().get*****);// coloque algum metodo GET para visualizar apenas o valori++;}ois.close();}
W
William_Ferreira
Foi mal a demora, estava sem pc, segue aqui o StackTrace:
/** * @param args the command line arguments */publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException{// TODO code application logic hereList<Acao>list=newArrayList<>();List<Acao>list2=newArrayList<>();list2.add(1);//teste, grava na list2 para depois ir para o arquivolist2.add(2);list2.add(3);list2.add(4);list2.add(5);gravaLista(list2);//grava no arquivolist=abrirArquivo();//retorna um list, os dados obtidos no arquivofor(Integeri:list)// imprime os resultadosSystem.out.println(i);}//fim do mainpublicstaticvoidgravaLista(List<Acao>lista)throwsIOException{ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("objetos salvos.ser",true));for(Acaoacao:lista){oos.writeObject(acao);}oos.close();
}
publicstaticListabrirArquivo()throwsIOException,ClassNotFoundException{// metodo retorna um listObjectInputStreamois=newObjectInputStream(newFileInputStream("objetos salvos.ser"));List<Acao>lista=newArrayList<>();Acaoacao;try{while(true){acao=(Acao)ois.readObject();lista.add(acao);}}catch(EOFExceptionr){//se fim do arquivoreturnlista;//quando alcança o fim do arquivo, retorna a lista com os dados obtidos do arquivo}finally{ois.close();}}//fim do abrirArquivo
}// fim da classe
J
jbezerrajr
A parte onde grava o list2 é mais para simplificar.
Na hora de colocar no compilador, substitua pelo objeto certo.
T
TalonNoxus
Eu vi que a StackTrace aponta um erro na linha 19 do main
Eu pressuponho que a linha 19 seja essa:
for(Integer i : list)// imprime os resultados
System.out.println(i);
O seu objeto list é do tipo Acao, e você esta usando um Integer
Você salvou um List no arquivo, e você ta querendo pegar os dados com o Acao, não importa se você salvou um list de Acao, você não pode pegar os dados com um objeto do tipo Acao, e sim com uma list
W
William_Ferreira
O código com Integer não é o meu, o meu código está no primeiro post.
T
Solucao aceita
TalonNoxus1 like
Tenta pegar os dados com um objeto list ao inves de Acoes
J
jbezerrajr1 like
Na verdade para resolver o problema será necessário criar duas classes que herdam ObjectOutputStream e ObjectInputStream.
Eu criei duas com os nomes LerObjetoArquivo e GravarObjetoArquivo.
Após terá que usar estas duas acima no lugar das ObjectOutputStream e ObjectInputStream criadas em seu programa.
W
William_Ferreira
Então galera, o jeito mais fácil que encontrei para resolver o problema foi fazer o que o TalonNoxux falou. Ao inves de capturar cada ação e ir povoando a list eu salvei logo todo a list e depois recuperei ela já inteira:
public static void main(String[] args) throws IOException, ClassNotFoundException {
List<Acoes> lista=new ArrayList<>();
InputStream is = new FileInputStream("objetos salvos.ser");
ObjectInputStream ois = new ObjectInputStream(is);
lista=(ArrayList<Acoes>) ois.readObject();
ois.close();
}
}