Recuperar objetos para uma ArrayList

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();
}

Willian,

Você consegue colocar todo o StackTrace?

Cara tente o seguinte:

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)

Continua dando a mesma exception =/

Já vou avisando, é minha primeira vez nesse site.

package teste;
import java.io.;
import java.util.
;

public class Teste {

/**
 * @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

}// fim da classe

A parte onde grava o list2 é mais para simplificar.
Na hora de colocar no compilador, substitua pelo objeto certo.

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

O código com Integer não é o meu, o meu código está no primeiro post.

Tenta pegar os dados com um objeto list ao inves de Acoes

1 curtida

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.

import java.io.*;

/**
*
*/
public class LerObjetoArquivo extends ObjectInputStream{

 public LerObjetoArquivo(InputStream in) throws IOException {
super(in);

}

@Override
protected void readStreamHeader() throws IOException {

}

}
////////////////////////////////////////////////////////////////////

import java.io.*;
/**
*
*/
public class GravarObjetoArquivo extends ObjectOutputStream {

  public GravarObjetoArquivo(OutputStream out) throws IOException {
super(out);

}

@Override
protected void writeStreamHeader() throws IOException {

reset();

}

}

Após terá que usar estas duas acima no lugar das ObjectOutputStream e ObjectInputStream criadas em seu programa.

1 curtida

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(); } }

Obrigado a todos!