2.13 - 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() + Delimitador.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, Delimitador.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; } }