Os materiais didáticos aqui disponibilizados estão licenciados através de Creative Commons Atribuição-SemDerivações-SemDerivados CC BY-NC-ND. Você possui a permissão para visualizar e compartilhar, desde que atribua os créditos do autor. Não poderá alterá-los e nem utilizá-los para fins comerciais.
Atribuição-SemDerivações-SemDerivados
CC BY-NC-ND
Cursos / Informática para Internet / Programação Estruturada / Aula
Agora que já criamos um tipo de dado do tipo registro para representar os dados de um jogador e que implementamos as funcionalidades básicas para um rank, precisamos definir em qual arquivo vão ser guardadas as informações de todos os jogadores, para que as mesmas não sejam perdidas entre uma partida e outra. Veja a seguinte declaração, que precisa ficar no início do corpo da classe JogoDaVelha:
private static File arquivo = new File("ranking.obj");
A variável “arquivo” é utilizada para representar o arquivo a ser criado para armazenar os dados do rank. Lembre-se que, para usar as classes Java que manipulam arquivos, precisamos importá-las através de comandos como o seguinte:
import java.io.File;
Para cada classe utilizada, você deve ter certeza de que o seu respectivo comando de import foi utilizado. Para implementar a manipulação de arquivos (escrita e leitura), vamos criar duas novas rotinas. A primeira delas é a salvarJogadores(), como mostrado a seguir:
public static void salvarJogadores() {
try {
ObjectOutputStream saida = new ObjectOutputStream(new FileOutputStream(arquivo));
saida.writeObject(jogadores);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
O código mostrado faz uso das classes ObjectOutputStream e FileOutputStream de Java. Ao criar um ObjectOutputStream, você deve passar um FileOutputStream que referencia o arquivo a ser criado (variável “arquivo”). Após isso, para salvar os registros basta chamar a rotina saida.writeObject() passando como parâmetro o array de registros “jogadores”. Não é fácil? Agora, todo esse código precisa estar dentro de um bloco try/catch, o qual você estudará bem no módulo de orientação a objetos, ficando nesta aula apenas o seu uso sem maiores explicações, já que isso vai além do contexto de nosso módulo.
Além da rotina para salvar registros, precisamos também de uma rotina para lê-los, chamada de lerJogadores():
public static void lerJogadores() {
try {
ObjectInputStream saida = new ObjectInputStream(new FileInputStream(arquivo));
jogadores = (Jogador[]) saida.readObject();
while (jogadores[quantidadeJogadores] != null && quantidadeJogadores < 50) {
quantidadeJogadores = quantidadeJogadores + 1;
}
} catch (FileNotFoundException e) {
// Não faz nada
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Na rotina lerJogadores(), é preciso fazer uso das classes ObjectInputStream e FileInputStream, que funcionam de forma similar ao que foi mostrado na rotina salvarJogadores(), só que agora a função é de leitura, e não escrita. A leitura é feita através da função saida.readObject(). Como essa função é genérica (funciona para vários tipos de dados), precisamos especificar o tipo que sabemos estar contido no arquivo, o qual é Jogador[]. Especificado esse tipo, podemos atribuir o resultado à variável “jogadores”. Por fim, precisamos atualizar a variável quantidadeJogadores de acordo com a quantidade de jogadores retornado dentro do vetor!
Para o jogo funcionar em arquivo, precisamos fazer só mais alguns ajustes: chamar a rotina lerJogadores() no início da main; chamar a rotina salvarJogadores no final da main; alterar a classe Jogador da seguinte forma:
public class Jogador implements Serializable {
Essa alteração na classe Jogador é para que as rotinas que utilizamos (writeObject e readObject) possam funcionar, sendo que esse assunto vai ser aprofundado no módulo de orientação a objetos. E se você adicionou corretamente os import às classes que utilizamos, a lista de import do arquivo JogoDaVelha estará da seguinte forma:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Scanner;{
Já o arquivo Jogador possuirá o seguinte import:
import java.io.Serializable;
Agora sim! O nosso jogo está completo com as funcionalidades básicas que implementamos na aula anterior e os recursos de cadastro, contagem de tempo e ranking. Compile, execute o jogo e divirta-se!
Versão 5.3 - Todos os Direitos reservados