3.20 DAOPessoaTexto.java
package br.aiec.persistencia.arquivotexto; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.LinkedList; import java.util.List; import java.util.StringTokenizer; import br.aiec.negocio.Pessoa; import br.aiec.persistencia.IDAOPessoa; /** * * A referida classe é apenas para uso didático. Deste modo, toda a lógica * presente foi reduzida ao mínimo necessário, * * uma vez que o objetivo é demonstrar o padrão DAO (Data Access Object). * Portanto,a lógica apresentada * * não contempla elementos como: segurança, escalabilidade, integridade, dentre * outros. * * @author Guilherme Veloso * */ public class DAOPessoaTexto implements IDAOPessoa { // Método utilizado para definir onde o arquivo texto será gravado. private File getFile() { return new DataSourceTexto().getArquivoTexto(); } /** * O método tem por finalidade inserir um objeto no arquivo texto * * @param Pessoa */ @Override public void inserir(Pessoa pessoa) { // Obtendo o arquivo de texto File file = getFile(); // Obtendo o separador de linha do sistema. Para windows (CR+LF ou // \r\n). Para linux (LF ou \n) String newLine = System.getProperty("line.separator"); try { // Criando um objeto que permite escrever/adicionar conteúdo no // arquivo texto FileWriter writer = new FileWriter(file, true); // Formatador de data SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy"); // Adicionado, ao final do arquivo, o conteúdo do parâmetro. writer.append(pessoa.getNome() + DelimitadorTexto.SIMBOLO + sf.format(pessoa.getDataNascimento()) + newLine); // Fechando o arquivo writer.close(); } catch (IOException e) { throw new RuntimeException("Falha ao criar/abrir o arquivo texto: " + file.getAbsolutePath(), e); } } /** * O método tem por finalidade atualizar um registro no arquivo texto * * @param Pessoa */ @Override public void atualizar(Pessoa pessoa) { // obtendo a lista de todos os registros List<Pessoa> listPessoas = consultarTodasPessoas(); // removendo o parâmetro da lista listPessoas.remove(pessoa.getId().intValue()); // Adicionando o novo parâmetro na lista listPessoas.add(pessoa.getId().intValue(), pessoa); // Obtendo o arquivo File file = getFile(); // Apagando arquivo file.delete(); // Inserindo cada elemento da lista em um novo arquivo for (int i = 0; i < listPessoas.size(); i++) { inserir(listPessoas.get(i)); } } /** * O método tem por finalidade excluir um registro no arquivo texto * * @param Pessoa */ @Override public void excluir(Pessoa pessoa) { // obtendo a lista de todos os registros List<Pessoa> listPessoas = consultarTodasPessoas(); // removendo o parâmetro da lista listPessoas.remove(pessoa.getId().intValue()); // Obtendo o arquivo File file = getFile(); // Apagando arquivo file.delete(); // Inserindo cada elemento da lista em um novo arquivo for (int i = 0; i < listPessoas.size(); i++) { inserir(listPessoas.get(i)); } } /** * * O método tem por finalidade consultar todas as pessoas (registros) * * presentes no arquivo de texto * * @return List<Pessoa> */ @Override public List<Pessoa> consultarTodasPessoas() { // Obtendo o arquivo de texto File file = getFile(); // Lista de retorno que conterá as pessoas registradas no banco List<Pessoa> listPessoas = new LinkedList<Pessoa>(); try { // Criando um Reader para ler o arquivo de texto Reader in = new FileReader(file); // Criando um buffer reader para facilitar a leitura por linhas do // reader BufferedReader reader = new BufferedReader(in); // Variável para contar o número de linhas lidas (Esse número é // considerado a chave primária do registro) Integer numberLine = 0; // Variável para guardar o conteúdo da linha propriamente dita String line; // Laço que irá percorrer todas as linhas do arquivo while ((line = reader.readLine()) != null) { // Cada linha possui um DELIMITADOR StringTokenizer st = new StringTokenizer(line, DelimitadorTexto.SIMBOLO.toString()); // Criando um objeto do tipo pessoa Pessoa pessoa = new Pessoa(); // atribuindo o numero da linha(chave primária do registro) pessoa.setId(numberLine++); // atribuindo o primeiro token (nome) pessoa.setNome(st.nextToken()); // Formatador de datas SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy"); // convertendo o segundo token (dataNascimento de String para // Date) e atribuindo o resultado ao objeto pessoa pessoa.setDataNascimento(sf.parse(st.nextToken())); // adicionando a pessoa (um registro lido) a lista de resultados listPessoas.add(pessoa); } // fechando o reader(arquivo texto) reader.close(); } catch (IOException e) { throw new RuntimeException("Falha ao ler o arquivo texto: " + file.getAbsolutePath(), e); } catch (ParseException e) { throw new RuntimeException("Falha ao converter a data: " + file.getAbsolutePath(), e); } // retornando a lista com todos os registros presentes no arquivo texto. return listPessoas; } @Override public Pessoa consultarPessoa(Pessoa parametro) { // obtendo a lista de todos os registros List<Pessoa> listPessoas = consultarTodasPessoas(); // retornando o parâmetro da lista return listPessoas.get(parametro.getId().intValue()); } }