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;
    }

}
Copyright © 2014 AIEC.