Prévia do material em texto
1 Linguagem de Programação I Entrada e Saída Textual com Persistência em Arquivos Exercícios Joinvile Batista Junior UFGD - LPI-E4 - Joinvile Batista Junior 2 Exemplo package util; import java.io.Serializable; import java.util.Calendar; import java.util.GregorianCalendar; public class Data implements Serializable { public static Data toData(String data_str) { if (!data_str.matches("\\d{2}/\\d{2}/\\d{4}")) { System.out.println("Erro na conversão para data do string: " + data_str); return null; } String[] partes = data_str.split("/"); return new Data (Integer.parseInt (partes[0]), Integer.parseInt (partes[1]), Integer.parseInt (partes[2])); } 2 UFGD - LPI-E4 - Joinvile Batista Junior 3 Exemplo private int dia, mês, ano; public Data(int dia, int mês, int ano) { this.dia = dia; this.mês = mês; this.ano = ano; } public int getDia() { return dia; } public int getMês() { return mês; } public int getAno() { return ano; } UFGD - LPI-E4 - Joinvile Batista Junior 4 Exemplo public int calcularIdade () { GregorianCalendar data_atual = new GregorianCalendar(); int dia_atual = data_atual.get(Calendar.DAY_OF_MONTH); int mês_atual = data_atual.get(Calendar.MONTH) + 1; // GregorianCalendar: mês varia de 0 a 11 int ano_atual = data_atual.get(Calendar.YEAR); int idade = ano_atual - ano; if ((mês_atual < mês) || ((mês_atual == mês) && (dia_atual < dia))) idade--; return idade; } 3 UFGD - LPI-E4 - Joinvile Batista Junior 5 Exemplo public int compareTo(Data data) { if (ano > data.getAno()) return 1; if (ano < data.getAno()) return -1; if (mês > data.getMês()) return 1; if (mês < data.getMês()) return -1; if (dia > data.getDia()) return 1; if (dia < data.getDia()) return -1; return 0; } public String toString() { String data; if (dia < 10) data = "0" + dia; else data = "" + dia; if (mês < 10) data += "/0" + mês + "/"; else data += "/" + mês + "/"; return data += ano; } } UFGD - LPI-E4 - Joinvile Batista Junior 6 Exemplo package util; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class PersistênciaArquivo { public static void salvar(Object raiz, String arquivo) { if (raiz == null) return; try { ObjectOutputStream output = new ObjectOutputStream (new FileOutputStream(arquivo)); output.writeObject(raiz); output.close(); } catch (Exception exceção) { System.out.println("Falha ao salvar no arquivo: " + arquivo + "\n"); } } 4 UFGD - LPI-E4 - Joinvile Batista Junior 7 Exemplo public static Object recuperar(String arquivo) { try { ObjectInputStream input = new ObjectInputStream(new FileInputStream(arquivo)); Object raizObject = input.readObject(); return raizObject; } catch (Exception exceção) { System.out.println("Falha na recuperação do arquivo: " + arquivo + "\n"); return null; } } } UFGD - LPI-E4 - Joinvile Batista Junior 8 Exemplo package entidade; import java.io.Serializable; import java.util.ArrayList; public class Obra implements Serializable { private static ArrayList<Obra> obras = new ArrayList(); public static void add(Obra obra) { obras.add(obra); } public static ArrayList<Obra> getObras() { return obras; } public static void setObras(ArrayList<Obra> obras) { Obra.obras = obras; } 5 UFGD - LPI-E4 - Joinvile Batista Junior 9 Exemplo protected String título; protected String autor; public Obra(String título, String autor) { this.título = título; this.autor = autor; } public String getTítulo() { return título; } public String getAutor() { return autor; } public String toString() { return "Livro: " + título + "\n Autor: " + autor; } } UFGD - LPI-E4 - Joinvile Batista Junior 10 Exemplo package entidade; import java.io.Serializable; public class Livro extends Obra implements Serializable { private String editora; private int edição; private int anoPublicação; public Livro(String título, String autor, String editora, int edição, int anoPublicação) { super(título, autor); this.editora = editora; this.edição = edição; this.anoPublicação = anoPublicação; } 6 UFGD - LPI-E4 - Joinvile Batista Junior 11 Exemplo public String getEditora() { return editora; } public int getEdição() { return edição; } public int getAnoPublicação() { return anoPublicação; } public String toString() { return "Livro: " + título + "\n Autor: " + autor + "\n Editora: " + editora + "\n Edição: " + edição + "\n Ano de Publicação: " + anoPublicação; } } UFGD - LPI-E4 - Joinvile Batista Junior 12 Exemplo package entidade; import java.io.Serializable; import util.Data; public class RelatórioTécnico extends Obra implements Serializable { public enum GrauSigilo {confidencial, reservado, público}; public static GrauSigilo toGrauSigilo(String grau_sigilo_str) { if (grau_sigilo_str.equals("confidencial")) return GrauSigilo.confidencial; if (grau_sigilo_str.equals("reservado")) return GrauSigilo.reservado; if (grau_sigilo_str.equals("público")) return GrauSigilo.público; return null; } 7 UFGD - LPI-E4 - Joinvile Batista Junior 13 Exemplo String empresa; GrauSigilo grauSigilo; Data data; public RelatórioTécnico(String título, String autor, String empresa, GrauSigilo grauSigilo, Data data) { super(título, autor); this.empresa = empresa; this.grauSigilo = grauSigilo; this.data = data; } public String getEmpresa() { return empresa; } UFGD - LPI-E4 - Joinvile Batista Junior 14 Exemplo public GrauSigilo getGrauSigilo() { return grauSigilo; } public Data getData() { return data; } public String toString() { return "Relatório Técnico: " + título + "\n Autor: " + autor + "\n Empresa: " + empresa + "\n Grau de Sigilo: " + grauSigilo + "\n Data: " + data; } } 8 UFGD - LPI-E4 - Joinvile Batista Junior 15 Exemplo package entidade; import java.io.Serializable; import util.Data; public class Tese extends Obra implements Serializable { private String universidade, orientador; private Data data; public Tese(String título, String autor, String universidade, String orientador, Data data) { super(título, autor); this.universidade = universidade; this.orientador = orientador; this.data = data; } UFGD - LPI-E4 - Joinvile Batista Junior 16 Exemplo public String getUniversidade() { return universidade; } public String getOrientador() { return orientador; } public Data getData() { return data; } public String toString() { return "Tese: " + título + "\n Autor: " + autor + "\n Universidade: " + universidade + "\n Orientador: " + orientador + "\n Data: " + data; } } 9 UFGD - LPI-E4 - Joinvile Batista Junior 17 Exemplo package interfaces; import entidade.Livro; import entidade.Obra; import entidade.RelatórioTécnico; import entidade.Tese; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import util.Data; public class EntradaSaída { private static BufferedReader buffer; UFGD - LPI-E4 - Joinvile Batista Junior 18 Exemplo public static void loopleituraObras() { System.out.println("--- Leitura de Dados de Obras"); buffer = new BufferedReader(new InputStreamReader(System.in)); String continuação = "S"; Obra obra = null; while (continuação.equalsIgnoreCase("S")) { obra = lerObra(); if (obra != null) Obra.add(obra); else System.out.println("Erro na leitura da obra"); System.out.print("Continuar [S/N] : "); try { continuação = buffer.readLine(); } catch (IOException exceção) { System.out.println("Erro na leitura da linha"); } } System.out.println(); } 10 UFGD - LPI-E4 - JoinvileBatista Junior 19 Exemplo private static Obra lerObra() { String título = lerString("título da obra"); if (título == null) return null; String autor = lerString("autor da obra"); if (autor == null) return null; String tipo_obra = lerString("tipo da obra [L(livro)-R(relatório)-T(tese)]"); if (tipo_obra.equalsIgnoreCase("L")) { String editora = lerString("editora do livro"); if (editora == null) return null; int edição = lerInteiroPositivo("edição do livro"); if (edição == -1) return null; int ano_publicação = lerInteiroPositivo("ano de publicação do livro"); if (ano_publicação == -1) return null; return new Livro(título, autor, editora, edição, ano_publicação); } UFGD - LPI-E4 - Joinvile Batista Junior 20 Exemplo if (tipo_obra.equalsIgnoreCase("R")) { String empresa = lerString("empresa do relatório técnico"); if (empresa == null) return null; RelatórioTécnico.GrauSigilo grau_sigilo = lerGrauSigilo("grau de sigilo do relatório técnico"); if (grau_sigilo == null) return null; Data data = lerData("data do relatório técnico"); if (data == null) return null; return new RelatórioTécnico(título, autor, empresa, grau_sigilo, data); } if (tipo_obra.equalsIgnoreCase("T")) { String universidade = lerString("universidade da tese"); if (universidade == null) return null; String orientador = lerString("nome do orientador da tese"); if (orientador == null) return null; Data data = lerData("data da defesa da tese"); if (data == null) return null; return new Tese(título, autor, universidade, orientador, data); } return null; } 11 UFGD - LPI-E4 - Joinvile Batista Junior 21 Exemplo private static String lerString(String dado) { String string = ""; System.out.print("Informe " + dado + " : "); try { string = buffer.readLine(); } catch (IOException exceção) { System.out.println("\nErro na leitura de: " + dado); return null; } return string; } UFGD - LPI-E4 - Joinvile Batista Junior 22 Exemplo private static int lerInteiroPositivo(String dado) { String string_número = ""; int número = 0; System.out.print("Informe " + dado + " : "); try { string_número = buffer.readLine(); número = Integer.valueOf(string_número).intValue(); } catch (IOException exceção) { System.out.println("\nErro na leitura de: " + dado); return -1; } catch (NumberFormatException exceção) { System.out.println("\nErro na conversão para inteiro de: " + dado); return -1; } return número; } 12 UFGD - LPI-E4 - Joinvile Batista Junior 23 Exemplo private static Data lerData(String dado) { String string = ""; System.out.print("Informe " + dado + " [dd/mm/aaaa] : "); try { string = buffer.readLine(); } catch (IOException exceção) { System.out.println("\nErro na leitura de: " + dado); return null; } return Data.toData(string); } UFGD - LPI-E4 - Joinvile Batista Junior 24 Exemplo private static RelatórioTécnico.GrauSigilo lerGrauSigilo(String dado) { String string = ""; System.out.print("Informe " + dado + " [C:confidencial - R:reservado - P:público] : "); try { string = buffer.readLine(); } catch (IOException exceção) { System.out.println("\nErro na leitura de: " + dado); return null; } if (string.equalsIgnoreCase("C")) string = "confidencial"; else if (string.equalsIgnoreCase("R")) string = "reservado"; else if (string.equalsIgnoreCase("P")) string = "público"; else return null; return RelatórioTécnico.toGrauSigilo(string); } } 13 UFGD - LPI-E4 - Joinvile Batista Junior 25 Exemplo package controle; import entidade.Obra; import interfaces.EntradaSaída; import java.util.ArrayList; import util.PersistênciaArquivo; public class Biblioteca { private static final String arquivo = "dados/Biblioteca.bds"; private static ArrayList<Obra> obras = new ArrayList(); public static void main(String[] args) { recuperarAplicação(); imprimirObras("--- Obras Recuperadas do Arquivo:", Obra.getObras()); EntradaSaída.loopleituraObras(); salvarAplicação(); imprimirObras("--- Obras Salvas em Arquivo:", Obra.getObras()); } UFGD - LPI-E4 - Joinvile Batista Junior 26 Exemplo private static void imprimirObras(String cabeçalho, ArrayList<Obra> obras) { System.out.println(cabeçalho); for (Obra obra : obras) System.out.println(obra.toString()); System.out.println(); } public static void salvarAplicação() { ArrayList objetos_aplicação = new ArrayList(); objetos_aplicação.add(Obra.getObras()); PersistênciaArquivo.salvar(objetos_aplicação, arquivo); } public static void recuperarAplicação() { ArrayList objetos_aplicação = (ArrayList) PersistênciaArquivo.recuperar(arquivo); if (objetos_aplicação != null) { Obra.setObras((ArrayList<Obra>) objetos_aplicação.get(0)); } } } 14 UFGD - LPI-E4 - Joinvile Batista Junior 27 Lista de Exercícios 4.1 – Adapte o exemplo: a) acrescente o atributo consulta [sim, não] na classe Obra, adaptando o método toString; b) defina o método “boolean lerBoolean(String dado)” na classe EntradaSaída e adapte o método lerObra. 4.2 - Adapte o exercício 4.1: a) acrescente o método “ArrayList<Obra> filtrarObras (char consulta, int ano_publicação_mínimo, RelatórioTécnico.GrauSigilo grau_sigilo, String universidade)” na classe Biblioteca, para selecionar as obras considerando que os filtros podem ser opcionais; b) acrescente o método lerChar(String dado) na classe EntradaSaída; c) acrescente o método “void selecionarObras (), na classe EntradaSaída, para ler os seguintes filtros de pesquisa (consulta, ano_publicação_mínimo, grau_sigilo, universidade), considerando que o usuário possa informar filtros opcionais, e chamar o método filtrarObras da classe Biblioteca; d) acrescente no método main, da classe Biblioteca, a pesquisa de obras e a impressão das obras selecionadas. UFGD - LPI-E4 - Joinvile Batista Junior 28 Lista de Exercícios 4.3 - Adapte o exercício 4.2: a) substituindo as classes Obra, Livro, RelatórioTécnico por Veículo (modelo, potência, ano, zero[sim, não]), Carro (combustível (gasolina, alcool, flex]), quatro_portas[sim, não]), Caminhão (n_eixos, capacidade[normal, bitrem, treminhão]) e Moto(n_cilindradas); b) substituindo os filtros de seleção por: ano_mínimo; zero, combustível, n_eixos_máximo, n_cilindradas_mínimo; c) substitua o nome da classe Biblioteca por VendaVeículos, adaptando os métodos necessários das classes: EntradaSaída e VendaVeículos. 4.4 – Adapte o exercício 4.3: a) acrescentando a classe Venda (valor, data, cliente, veículo) e classe Cliente (nome, CPF, telefone) e adaptando os métodos de criação e impressão para vendas; b) adapte os métodos necessários de obras para vendas, nas classes EntradaSaída e VendaVeículos, e acrescente os filtros adicionais: valor_mínimo e valor_máximo.