Boa tarde.
Estou fazendo um trabalho de um sistema de informações de pokémons, nesse trabalho eu crio alguns objetos. Gostaria de saber como que faço para salvar esses objetos já instanciados e depois como que faço para ler esses objetos salvos.
Utilize banco de dados. Talvez mysql seja uma boa pedida \o
Então, até onde aprendemos e a professora está pedindo, não podemos usar banco de dados. Então teria que salvar em um arquivo TXT(se for possível).
Você pode usar serialização de objetos, que salva os objetos Java completos e permite a leitura posterior. Procure por “Java Serialização de Objetos” no Google.
Pode também ler e gravar arquivos txt com os dados que precisa. Cada linha do arquivo poderia ser um objeto completo, e os atributos poderiam ser separados por um separador como vírgula ou ponto e vírgula, e você precisaria fazer o parse do arquivo quebrando por esse separador e recriando os objetos.
Abraço.
Posta as classes dos objetos que você precisa salvar que fica fácil mostrar um exemplo.
Então, creio que passando a classe não vai adiantar muito. O Sistema comporta assim:
Tenho 5 classes diferentes que são os tipos dos pokemons, todas elas tem “implements Serializable”. Para “salvar” esses objetos eu tenho uma classe Pokedex, que possui um arrayList de pokemons, nesse arrayList eu “salvo” esses objetos pokemons (no pokedex tbm tem “implements Serializable”). Estou salvando apenas a pokedex através do “FileOutputStream” e lendo através do “FileInputStream”, está salvando porém quando reinicio o programa novamente, não está puxando nada do arquivo salvo.
Classe do tipo do pokemon - “public class Agua extends Informacoes implements Serializable, InfoPok” (tenho cinco assim, só com o nome diferente)
Classe do tipo pokedex - "public class Pokedex implements Serializable"
Classe Menu, que faz interagir com todas as outras - "
/**
* Salva os objetos instanciados em um arquivo no computador
* @param obj
*/
public void salvarObjeto(Pokedex obj){
try{
FileOutputStream arquivoGrav = new FileOutputStream(“gravObj.dat”);
ObjectOutputStream objGravar = new ObjectOutputStream(arquivoGrav);
objGravar.writeObject(obj);
objGravar.flush();
objGravar.close();
System.out.println("Objeto gravado com sucesso!");
}catch(Exception e) {
System.out.println("Erro ao salvar arquivo");
}
}
/**
* Retorna o objeto que está salvo no computador
* @return
*/
public Pokedex getObjecto(){
try{
//Carrega o arquivo
FileInputStream arquivoLeitura = new FileInputStream("gravObj.dat");
ObjectInputStream objLeitura = new ObjectInputStream(arquivoLeitura);
Pokedex pok = (Pokedex)objLeitura.readObject();
System.out.println("Num: "+pok.getNumPokemon());
objLeitura.close();
arquivoLeitura.close();
return pok;
}catch(Exception e) {
System.out.println("Erro ao ler arquivo");
return null;
}
}..."
A opção de salvar os objetos só está na classe menu que faz a interação entre todas as outras. O código enviado é apenas da parte que salva…
Código que recupera os objetos salvos.
“
public void menuInicio(){
Pokedex pokedex;
int arq = 0;
System.out.println(”(0) - Iniciar novo arquivo\n"
+ “(1) - abrir arquivo salvo”);
Scanner lerArq = new Scanner(System.in);
arq = erro(lerArq.next());
if(arq == 0){
pokedex = new Pokedex();
}else{
pokedex = getObjecto();
if(pokedex == null){
pokedex = new Pokedex();
}
} …"
O Serializable é uma mão na roda pra você serializar o objeto usando o mecanismo de serialização do Java.
Mas você havia dito que quer salvar o objeto em um arquivo .txt, por isso que pedi pela estrutura das classes.
Se abrir um arquivo onde você persistiu objetos com o ObjectOutputStream.writeObject, você não terá conteúdo de textual, a menos que você reimplemente o mecanismo de serialização padrão, conforme documentado na interface Serializable.
Até então, estava achando que salvar o arquivo em txt seria uma boa opção, mas depois da resposta ali em cima, vi que a serialização seria uma escolha melhor, pois não preciso de fato acessar o arquivo txt gerado, preciso apenas recuperar os objetos “salvos” no projeto para que em vez de ficar criando vários objetos todas as vezes que eu inicializar o programa, eu simplesmente recupero os quais que já estiverem “salvos” para manipular de acordo com o programa.
Contudo o objeto pokedex de fato está sendo salvo, porém não estou conseguindo acessar os arrayList que salva os objetos de outro tipo.
os arrayList na pokedex são statics
O que é static pertence à classe e não aos objetos da classe.
Porque precisa ser static?
estava colocando static pois preciso usar o arryList na classe Ginasio (que recupera os arquivos do arrayList de pokemons).
Qual a relação entre a classe Ginasio e a classe Pokedex?
então a classe pokedex e ginasio não possuem uma relação direta (pai, filho etc), a classe pokedex só armazena um arrayList de ginasio e outro arrayList de pokemons. Mas mudei a forma que eu estava usando a classe ginasio. Estava instanciando um novo objeto pokedex dentro da classe ginasio para poder recuperar os dados, ai para resolver isso, estou fazendo tudo dentro da classe menu, que controla tudo (classe ginasio e pokemon) e instancia a classe pokedex apenas uma unica vez, ai está dando certo agora