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?
public class TesteRecupera {
public static void main(String[] args) throws IOException, ClassNotFoundException {
InputStream is = new FileInputStream("objetos salvos.ser");
ObjectInputStream ois = new ObjectInputStream(is);
Acoes acao=(Acoes)ois.readObject();
ArrayList<Acoes> lista=new ArrayList();
while(acao!=null){
lista.add(acao);
acao=(Acoes)ois.readObject();
}
ois.close();
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
InputStream is = new FileInputStream("objetos salvos.ser");
ObjectInputStream ois = new ObjectInputStream(is);
ArrayList<Acoes> lista=new ArrayList();
int i = 0;
while(ois.readBoolean()){ // acho e isso funciona, sei la, nunca usei ObjectInputStream
Acoes acao=(Acoes)ois.readObject(); // agora vc cria uma acao e adiciona ao list
lista.add(acao);
System.out.print(lista.get().get*****); // coloque algum metodo GET para visualizar apenas o valor
i++;
}
ois.close();
}
Foi mal a demora, estava sem pc, segue aqui o StackTrace:
Exception in thread “main” java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at guardador.TesteRecupera.main(TesteRecupera.java:19)
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException, ClassNotFoundException {
// TODO code application logic here
List<Acao> list = new ArrayList<>();
List<Acao> list2 = new ArrayList<>();
list2.add(1);//teste, grava na list2 para depois ir para o arquivo
list2.add(2);
list2.add(3);
list2.add(4);
list2.add(5);
gravaLista(list2);//grava no arquivo
list = abrirArquivo();//retorna um list, os dados obtidos no arquivo
for(Integer i : list)// imprime os resultados
System.out.println(i);
}//fim do main
public static void gravaLista(List<Acao> lista) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("objetos salvos.ser",true));
for (Acao acao : lista) {
oos.writeObject(acao);
}
oos.close();
}
public static List abrirArquivo() throws IOException, ClassNotFoundException{// metodo retorna um list
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("objetos salvos.ser"));
List<Acao> lista=new ArrayList<>();
Acao acao;
try{
while(true){
acao = (Acao)ois.readObject();
lista.add(acao);
}
}catch(EOFException r){//se fim do arquivo
return lista;//quando alcança o fim do arquivo, retorna a lista com os dados obtidos do arquivo
}
finally{
ois.close();
}
}//fim do abrirArquivo
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
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();
}
}