Difference between revisions of "Entradas e Saídas em Java/Exercício 04: Registo de Gatos"

From Wiki**3

< Entradas e Saídas em Java
(Problema)
(Solução)
Line 9: Line 9:
 
== Solução ==
 
== Solução ==
  
 +
A classe gato, descrita no enunciado, pode ser a seguinte (note-se que deve implementar '''java.io.Serializable'''):
 +
<java5>
 +
import java.io.Serializable;
 +
 +
public class Cat implements Serializable {
 +
  private String _name = "";
 +
  private int    _age = 0;
 +
 +
  public Cat(String name, int age) { _name = name; _age = age; }
 +
 +
  public String toString() { return "CAT: " + _name + " " + _age; }
 +
}
 +
</java5>
 +
 +
A classe do registo, '''CatRegistry''', é simplesmente um gestor de um mapa de gatos (também deve ser serializável):
 +
<java5>
 +
import java.util.Map;
 +
import java.util.TreeMap;
 +
import java.io.Serializable;
 +
 +
public class CatRegistry implements Serializable {
 +
  private Map<String, Cat> _registry = new TreeMap<String, Cat>();
 +
 +
  public Cat  get(String name)          { return _registry.get(name); }
 +
  public void put(String name, Cat cat) { _registry.put(name, cat); }
 +
}
 +
</java5>
 +
 +
Finalmente, a classe '''App''' é simplesmente a classe que contém a função '''main'''. Os comentários nessa função seguem os passos descritos no enunciado.
 +
<java5>
 +
import java.io.ObjectOutputStream;
 +
import java.io.BufferedOutputStream;
 +
import java.io.FileOutputStream;
 +
 +
import java.io.ObjectInputStream;
 +
import java.io.BufferedInputStream;
 +
import java.io.FileInputStream;
 +
 +
import java.io.IOException;
 +
 +
public class App {
 +
  public static void main(String[] args) throws IOException, ClassNotFoundException {
 +
    // (1) cria um registo e dois gatos
 +
    CatRegistry registry = new CatRegistry();
 +
    Cat c1 = new Cat("Pantufa", 9);
 +
    Cat c2 = new Cat("Tareco", 1);
 +
    // (2) insere os gatos no registo
 +
    registry.put("Pantufa", c1);
 +
    registry.put("Tareco", c2);
 +
    // (3) guarda o registo em disco
 +
    ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("cats.dat")));
 +
    oos.writeObject(registry);
 +
    oos.close();
 +
    // (4) recupera o registo a partir do disco
 +
    ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("cats.dat")));
 +
    CatRegistry previousRegistry = (CatRegistry)ois.readObject();
 +
    ois.close();
 +
    // (5) recupera os dois gatos a partir do registo
 +
    Cat recCat1 = previousRegistry.get("Pantufa");
 +
    Cat recCat2 = previousRegistry.get("Tareco");
 +
    // (6) apresenta os gatos na saída (System.out)
 +
    System.out.println(recCat1);
 +
    System.out.println(recCat2);
 +
  }
 +
}
 +
</java5>
  
 
[[category:Ensino]]
 
[[category:Ensino]]

Revision as of 20:12, 4 November 2013

Problema

Modele e implemente uma classe CatRegistry cujas instâncias registam gatos. A classe deve manter um mapa de gatos, indexando-os pelos respectivos nomes. Não é necessário implementar Cat. Considere que a classe Cat tem atributos idade (_age) e nome (_name). Considere ainda que o construtor de Cat aceita os valores para os atributos mencionados e que os métodos de acesso (getters e setters) estão definidos. Considere ainda que Cat implementa a interface Serializable.

A interface da classe CatRegistry contém os métodos de inserção (put) e consulta (get). O primeiro aceita um gato e regista-o; o segundo aceita o nome de um gato e devolve o gato, caso exista, ou null, se não existir. Deve ser possível guardar em disco as instâncias do registo.

Escreva uma função main que execute as seguintes operações: (1) cria um registo e dois gatos; (2) insere os gatos no registo; (3) guarda o registo em disco; (4) recupera o registo a partir do disco; (5) recupera os dois gatos a partir do registo; e (6) apresenta os gatos na saída (System.out).

Solução

A classe gato, descrita no enunciado, pode ser a seguinte (note-se que deve implementar java.io.Serializable): <java5> import java.io.Serializable;

public class Cat implements Serializable {

 private String _name = "";
 private int    _age = 0;
 public Cat(String name, int age) { _name = name; _age = age; }
 public String toString() { return "CAT: " + _name + " " + _age; }

} </java5>

A classe do registo, CatRegistry, é simplesmente um gestor de um mapa de gatos (também deve ser serializável): <java5> import java.util.Map; import java.util.TreeMap; import java.io.Serializable;

public class CatRegistry implements Serializable {

 private Map<String, Cat> _registry = new TreeMap<String, Cat>();
 public Cat  get(String name)          { return _registry.get(name); }
 public void put(String name, Cat cat) { _registry.put(name, cat); }

} </java5>

Finalmente, a classe App é simplesmente a classe que contém a função main. Os comentários nessa função seguem os passos descritos no enunciado. <java5> import java.io.ObjectOutputStream; import java.io.BufferedOutputStream; import java.io.FileOutputStream;

import java.io.ObjectInputStream; import java.io.BufferedInputStream; import java.io.FileInputStream;

import java.io.IOException;

public class App {

 public static void main(String[] args) throws IOException, ClassNotFoundException {
   // (1) cria um registo e dois gatos
   CatRegistry registry = new CatRegistry();
   Cat c1 = new Cat("Pantufa", 9);
   Cat c2 = new Cat("Tareco", 1);
   // (2) insere os gatos no registo
   registry.put("Pantufa", c1);
   registry.put("Tareco", c2);
   // (3) guarda o registo em disco
   ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("cats.dat")));
   oos.writeObject(registry);
   oos.close();
   // (4) recupera o registo a partir do disco
   ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("cats.dat")));
   CatRegistry previousRegistry = (CatRegistry)ois.readObject();
   ois.close();
   // (5) recupera os dois gatos a partir do registo
   Cat recCat1 = previousRegistry.get("Pantufa");
   Cat recCat2 = previousRegistry.get("Tareco");
   // (6) apresenta os gatos na saída (System.out)
   System.out.println(recCat1);
   System.out.println(recCat2);
 }

} </java5>