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: código Java)
 
(4 intermediate revisions by the same user not shown)
Line 7: Line 7:
 
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''').
 
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 ==
+
== Solução: diagrama de classes UML ==
 +
 
 +
== Solução: código Java ==
  
 
A classe gato, descrita no enunciado, pode ser a seguinte (note-se que deve implementar '''java.io.Serializable'''):
 
A classe gato, descrita no enunciado, pode ser a seguinte (note-se que deve implementar '''java.io.Serializable'''):
<java5>
+
{{CollapsedCode|Cat.java|
 +
<source lang="java">
 
import java.io.Serializable;
 
import java.io.Serializable;
  
Line 18: Line 21:
  
 
   public Cat(String name, int age) { _name = name; _age = age; }
 
   public Cat(String name, int age) { _name = name; _age = age; }
 +
 +
  public String getName() { return _name; }
  
 
   public String toString() { return "CAT: " + _name + " " + _age; }
 
   public String toString() { return "CAT: " + _name + " " + _age; }
 
}
 
}
</java5>
+
</source>
 +
}}
  
 
A classe do registo, '''CatRegistry''', é simplesmente um gestor de um mapa de gatos (também deve ser serializável):
 
A classe do registo, '''CatRegistry''', é simplesmente um gestor de um mapa de gatos (também deve ser serializável):
<java5>
+
{{CollapsedCode|CatRegistry.java|
 +
<source lang="java">
 
import java.util.Map;
 
import java.util.Map;
 
import java.util.TreeMap;
 
import java.util.TreeMap;
Line 32: Line 39:
 
   private Map<String, Cat> _registry = new TreeMap<String, Cat>();
 
   private Map<String, Cat> _registry = new TreeMap<String, Cat>();
  
   public Cat  get(String name)         { return _registry.get(name); }
+
   public Cat  get(String name) { return _registry.get(name); }
   public void put(String name, Cat cat) { _registry.put(name, cat); }
+
   public void put(Cat   cat) { _registry.put(cat.getName(), cat); }
 
}
 
}
</java5>
+
</source>
 +
}}
  
 
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.
 
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>
+
{{CollapsedCode|App.java (versão clássica)|
 +
<source lang="java">
 
import java.io.ObjectOutputStream;
 
import java.io.ObjectOutputStream;
 
import java.io.BufferedOutputStream;
 
import java.io.BufferedOutputStream;
Line 50: Line 59:
  
 
public class App {
 
public class App {
   public static void main(String[] args) throws IOException, ClassNotFoundException {
+
   public static void main(String[] args) {
 
     // (1) cria um registo e dois gatos
 
     // (1) cria um registo e dois gatos
 
     CatRegistry registry = new CatRegistry();
 
     CatRegistry registry = new CatRegistry();
Line 56: Line 65:
 
     Cat c2 = new Cat("Tareco", 1);
 
     Cat c2 = new Cat("Tareco", 1);
 
     // (2) insere os gatos no registo
 
     // (2) insere os gatos no registo
     registry.put("Pantufa", c1);
+
     registry.put(c1);
     registry.put("Tareco", c2);
+
     registry.put(c2);
     // (3) guarda o registo em disco
+
 
    ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("cats.dat")));
+
     try {
    oos.writeObject(registry);
+
      // (3) guarda o registo em disco
    oos.close();
+
      ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("cats.dat")));
     // (4) recupera o registo a partir do disco
+
      oos.writeObject(registry);
    ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("cats.dat")));
+
      oos.close();
    CatRegistry previousRegistry = (CatRegistry)ois.readObject();
+
     }
    ois.close();
+
    catch (IOException e) { e.printStackTrace(); }
    // (5) recupera os dois gatos a partir do registo
+
 
    Cat recCat1 = previousRegistry.get("Pantufa");
+
    try {
    Cat recCat2 = previousRegistry.get("Tareco");
+
      // (4) recupera o registo a partir do disco
    // (6) apresenta os gatos na saída (System.out)
+
      ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("cats.dat")));
    System.out.println(recCat1);
+
      CatRegistry previousRegistry = (CatRegistry)ois.readObject();
    System.out.println(recCat2);
+
      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);
 +
    }
 +
    catch (IOException            e) { e.printStackTrace(); }
 +
    catch (ClassNotFoundException e) { e.printStackTrace(); }
 
   }
 
   }
 
}
 
}
</java5>
+
</source>
 +
}}
 +
 
 +
{{CollapsedCode|App.java (versão com AutoCloseables) |
 +
<source lang="java">
 +
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) {
 +
    // (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(c1);
 +
    registry.put(c2);
 +
 
 +
    try (ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("cats.dat")))) {
 +
      // (3) guarda o registo em disco
 +
      oos.writeObject(registry);
 +
    }
 +
    catch (IOException e) { e.printStackTrace(); }
 +
 
 +
    try (ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("cats.dat")))) {
 +
      // (4) recupera o registo a partir do disco
 +
      CatRegistry previousRegistry = (CatRegistry)ois.readObject();
 +
      // (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);
 +
    }
 +
    catch (IOException            e) { e.printStackTrace(); }
 +
    catch (ClassNotFoundException e) { e.printStackTrace(); }
 +
  }
 +
}
 +
</source>
 +
}}
 +
 
 +
== Compilação e Execução ==
 +
 
 +
A compilação é o processo habitual:
 +
 
 +
  javac App.java Cat.java CatRegistry.java
 +
 
 +
A execução do programa é como se segue:
 +
 
 +
  java App
 +
 
 +
Resultado da execução:
 +
 
 +
  CAT: Pantufa 9
 +
  CAT: Tareco 1
 +
 
  
 
[[category:Ensino]]
 
[[category:Ensino]]

Latest revision as of 12:22, 14 October 2022

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: diagrama de classes UML

Solução: código Java

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

Cat.java
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 getName() { return _name; }

  public String toString() { return "CAT: " + _name + " " + _age; }
}

A classe do registo, CatRegistry, é simplesmente um gestor de um mapa de gatos (também deve ser serializável):

CatRegistry.java
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(Cat    cat)  { _registry.put(cat.getName(), cat); }
}

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.

App.java (versão clássica)
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) {
    // (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(c1);
    registry.put(c2);

    try {
      // (3) guarda o registo em disco
      ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("cats.dat")));
      oos.writeObject(registry);
      oos.close();
    }
    catch (IOException e) { e.printStackTrace(); }

    try {
      // (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);
    }
    catch (IOException            e) { e.printStackTrace(); }
    catch (ClassNotFoundException e) { e.printStackTrace(); }
  }
}
App.java (versão com AutoCloseables)
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) {
    // (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(c1);
    registry.put(c2);

    try (ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("cats.dat")))) {
      // (3) guarda o registo em disco
      oos.writeObject(registry);
    }
    catch (IOException e) { e.printStackTrace(); }

    try (ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("cats.dat")))) {
      // (4) recupera o registo a partir do disco
      CatRegistry previousRegistry = (CatRegistry)ois.readObject();
      // (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);
    }
    catch (IOException            e) { e.printStackTrace(); }
    catch (ClassNotFoundException e) { e.printStackTrace(); }
  }
}

Compilação e Execução

A compilação é o processo habitual:

 javac App.java Cat.java CatRegistry.java

A execução do programa é como se segue:

 java App

Resultado da execução:

 CAT: Pantufa 9
 CAT: Tareco 1