Lendo um arquivo .txt e transformando em DAO

26 respostas
arthurgon

Olá gente;
Tenho a seguinte duvida, preciso importar uma arquivo .txt para Java. Até aí td bem...mas meu problema é que
preciso transformar agora esse arquivo depois de lido em uma classe DAO para inserir o texto em uma PROCEDURE.
Estou procurando pela NET se alguem já teve uma situação assim como exemplo, mas ainda não tive sucesso.
Eis a importação:

i
mport java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class NovoTeste {

	public static void main(String[] args) throws IOException {

		try {
			// FileReader para o arquivo:
			FileReader fr = new FileReader("C:/Documents and Settings/arthur.gomes/Desktop/cliente.txt");
			// BufferedReader para o FileReader:
			BufferedReader br = new BufferedReader(fr);
			String temp;
			// A cada iteração, l~e uma linha do arquivo e atribui-a a temp:
			while ((temp = br.readLine()) != null) {
				// Aqui vc gera a sua "lista". No caso, imprimi cada linha na
				// tela.
				System.out.println(temp + "\n");
			}
		} catch (FileNotFoundException e1) {
			System.out.println("File not found!");
		}
	}

}

Até aqui td bem. Me imprime o texto no console. Mas agora...como transformo esse texto em uma classe DAO?

Obrigado.

26 Respostas

antoniopopete

Não entendi porque você precisa fazer essa conversão, acho que está confundindo as coisas, não?

http://www.javafree.org/content/view.jf?idContent=183

arthurgon

Então…eu tava lendo justamente esse link que vc me passou. Como não tenho experiência com “pattern DAO”,
to tentando entender. Na verdade é idéia é que uma Procedure leia o arquivo .txt…mas pelo que me passaram, eu preciso importar o arquivo antes…como aliás fiz. Depois formar uma classe DAO desse arquivo para poder chamar a Procedure.

arthurgon

Olá…fazendo uma correção…preciso importar o arquivo .txt e transformar em uma classe BEAN. Aí sim que farei a classe DAO.
Se alguem puder me ajudar…agradeço.

Paulo_Faulstich

Cara não entendi muito.

1° Pq tem que ser uma procedure para ler este arquivo e não o próprio java?

2° Eu faria a parte de negócio no próprio java ao invés de usar uma proc.

3° Porque tens que criar o Bean a partir desse arquivo? As informações do cliente que virão desse arquivo não serão sempre as mesmas?

4° O DAO serve para criar os teus métodos que farão a persistência com o banco de dados.

Tem uma documentação que fala do DAO

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

Inclusive um tópico de quando deve ser criado o DAO

http://www.guj.com.br/posts/list/27202.java

Flw

arthurgon

Aí que está…gostaria tbm de poder fazer do jeito mais simples…uma vez que conheço as informações no BEAN, mas a idéia é q importe o arquivo .txt…converta para uma classe Java (BEAN) e com essa classe farei o DAO no qual vou inserir as informações na devida PROCEDURE.
Li algo sobre importar arquivos txt e até já fiz os testes…mas e pra converter para uma classe Bean? Conhece algum tutorial?

Valeu.

sergiotaborda

arthurgon:
Olá gente;
Tenho a seguinte duvida, preciso importar uma arquivo .txt para Java. Até aí td bem…mas meu problema é que
preciso transformar agora esse arquivo depois de lido em uma classe DAO

A coisa é ao contrário. Supondo que o texto contem dados de cliente então vc tem que criar objetos cliente, popular esses objetos com os dados do arquivo. Quando alguem consultar o DAO vc retorna esses objetos. algo assim

public class TxtFileClientDAO  {

   private String filePath; // "C:/Documents and Settings/arthur.gomes/Desktop/cliente.txt"

    public synchronized  Collection<Client> findAll(){

    try {  
            Collection<Client> clients = new LinkedList<Client>();

             FileReader fr = new FileReader(filePath);  
             // BufferedReader para o FileReader:  
             BufferedReader br = new BufferedReader(fr);  
             String line;  

            while ((line = br.readLine()) != null) {  
                  Client client = new Client();
                    // faz o parse da linha e seja valores , por exemplo se fosse separado por ; 
                    String[] fields = line.split(";");
                      client.setName(fields[0]);
                         ... // etc .. 
                      clients.add(client);
             }  
          } catch (FileNotFoundException e) {  
             throw new DAOException(e);
         }  catch (IOException e) {  
             throw new DAOException(e);
         }  
    }
}

Voc pode bufferizar a lista ou seja, carrega apenas uma vez e manter na memoria. Se o arquivo muda esse tecnica é falha, mas pode usar algum tipo de file watcher para ser avisado que o arquivo mudor e recarregar conforme.

arthurgon

Cara valeu…vou testar aqui. Eu falo o resultado.

Abraço.

arthurgon

Cara eu to usando Java 1.4 por necessidade do projeto. A aplicação pede que eu converta para Java 5.
Como faço para corrigir os erros? Estão dando justamente em COLLECTION e nas tags do List.

Ficou assim o meu código...sendo MensagemVO como a classe Bean que criei. Pra ser honesto ainda não entrou na minha cabeça o conceito de importar um .txt ,criar objetos e popular com os dados do .txt. Esses objetos eu crio na mão como uma classe Bean. É isso? No meu caso a MensagemVO.

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedList;

public class MensagemDAO {

	 private String filePath; // "C:/Documents and Settings/arthur.gomes/Desktop/P2DAQ014.txt"  
	   
	     public synchronized  Collection<MensagemVO> findAll(){  
	   
	     try {    
	             Collection<MensagemVO> mensagens = new LinkedList<MensagemVO>();  
	   
	              FileReader fr = new FileReader(filePath);    
	              // BufferedReader para o FileReader:    
	              BufferedReader br = new BufferedReader(fr);    
	              String line;    
	   
	             while ((line = br.readLine()) != null) {    
	            	 MensagemVO mensagem = new MensagemVO();  
	                       
	                     String[] fields = line.split(";");  
	                   
                            //Justamente aqui que ficam minhas dúvidas,como populo esse objeto com os dados do .txt? 
                             mensagem.setCod_msg(fields[0]); 
	                     
	                     
	                     mensagens.add(mensagem);  
	              }    
	           } catch (FileNotFoundException e) {    
	              throw new Exception(e);  
	          }  catch (IOException e) {    
	              throw new Exception(e);  
	          }    
	     }  
	 }
sergiotaborda

arthurgon:
Cara eu to usando Java 1.4 por necessidade do projeto. A aplicação pede que eu converta para Java 5.
Como faço para corrigir os erros? Estão dando justamente em COLLECTION e nas tags do List.

Se está usando 1.4 e não o 5, retire tudo o que estiver entre <> O 1.4 não tem generics.

Como popular o objeto com os dados ? Ora, vc tem que saber que dados estão no arquivo e em que formato ( ordem , etc…)
Ou seja, vc tem que conhecer o protocolo do arquivo. Ai vc lê e processa as informações para serem colocados no objeto
Se forem necessárias conversões ( para numeros ou datas) faça-as.

Exemplo de arquivo : 1 linha é um objeto

Maria Esteves;23042008;98;Olá, como está ?,true
João Limeira;12072008;98;Segundo cara,false

// processamento do arquivo

String[] fields = line.split(";");
MensagemVO mensagem = new MensagemVO();
SimpleDateFormat dformat = new SimpleDateFormat("ddMMyyyy");

mensagem.setNome(fields[0]) // 0 porque é a primeira coluna

Date envio = dformt.parse(fields[1]); // segunda coluna
mensagem.setEnvio(envio ) 

int prioridade = Integer.parseInt(fields[2]); // segunda coluna
mensagem.setPrioridade(prioridade) ;

mensagem.setTexto(fields[3]) ;

mensagem.setExterno(fields[4]).equals("true") ;

Não entendo qual seja a dificuldade…

arthurgon

É a primeira vez que faço esse tipo de trabalho. É como andar de patins…depois que aprende não esquece mais.
A dificuldade é só na primeira aplicação…mas vou conseguir.

Valeu.

Paulo_Faulstich

Dai amigo admiro teu esforço, pelo que vejo você esta meio confuso realmente em algumas coisas. Não sem quem falou que você precisava dessa proc para o projeto, mas isso não é necessário cara você deverá criar um padrão para o arquivo, pois tu não esta trabalhando com ontologia, portanto vais ter que dizer que o teu .txt esta com o formato X por exemplo, depois de estabelecer este formato tens que fazer o teu programa algo como o sergio postou pra você, lógico que isto depende do conteúdo que você vai ter no teu .txt se cada campo vai ser separado por “;” ou qualquer outro caracter para que tu possa identificar o que é o nome do cliente, idade, código etc.

Dai você me diz - Paulo a questão é que a minha proc já esta pronta com o inser montado, mesmo que isto já esteja pronto você vai precisar que o arquivo .txt esteja com um padrão se não a proc não vai saber quem é quem, tipo (nome cliente, idade, código etc)

Quando tu tiveres o padrão para o txt poderás criar o Bean.

Por exemplo.

Vai ter que ter no txt as seguintes informações:

Código do Cliente
Nome do Cliente
Idade
Sexo

A partir disso vai criar o teu bean:

Algo como.

class BeanCliente {

private Integer codigoCliente;
private String nomeCliente
private Integer idade;
private Char sexo;

// aqui vais os geters e seters dos respectivos atributos.

}

Depois de ter o teu bean e o teu txt padronizado deverás criar o teu programa para ler o teu txt algo como o exemplo que o nosso amigo Sérgio postou.

O teu DAO servira para criar o método incluir por exemplo.

Da uma lida no blog do amigo Sérgio que paticularmente achei muito bom, já que ele não fez a propaganda eu faço hehe.

Abraço.

fcoury

Cara,

Dá uma olhada na JFileHelpers: http://jfilehelpers.com

Veja os exemplos!

Abraços.

arthurgon

Olá meus amigos;

Ainda não deu certo. Estou tendo um erro acredito eu de formatação do texto.
Segue o erro:

java.lang.NumberFormatException: For input string: "CAMPO"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
	at java.lang.Integer.parseInt(Integer.java:468)
	at java.lang.Integer.parseInt(Integer.java:518)
	at testes.MensagemDAO.main(MensagemDAO.java:25)
Exception in thread "main"

Fora isso...o código ficou dessa forma:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.SQLException;

public class MensagemDAO {

	 public static void main(String[] args) throws Exception,SQLException {
	   
	     try {    
	       
	    		FileReader fr = new FileReader("C:/Documents and Settings/arthur.gomes/Desktop/P2DAQ014.txt");
	    		     // BufferedReader para o FileReader:    
	              BufferedReader br = new BufferedReader(fr);    
	              String line;    
	   
	             while ((line = br.readLine()) != null) {    
	            	 MensagemVO vo = new MensagemVO();  
	                       
	                  String[] fields = line.split(";");  
	                    
	                   int cod_msg = Integer.parseInt(fields[0]);
	     				vo.setCod_msg(cod_msg);
	     				
	     				vo.setDescr_msg(fields[1]);
	     				
	     				int cod_emp = Integer.parseInt(fields[2]);
	     				vo.setCod_emp(cod_emp);
	     				
	     				int cod_fil = Integer.parseInt(fields[3]);
	     				vo.setCod_fil(cod_fil);
	     				
	     				int cod_tiplis = Integer.parseInt(fields[4]);
	     				vo.setCod_tiplis(cod_tiplis);
	     				
	     				vo.setTs_tiplis(fields[5]);
	     				 
	     				  //mensagens.add(vo); 
	     				
	     				System.out.println(line + "\n");
	     				 
	              }    
	           } catch (FileNotFoundException e) {    
	              throw new Exception(e);  
	          }  catch (IOException e) {    
	              throw new Exception(e);  
	          }    
	    
	 }  
	
}

Será que alguem poderia me ajudar? Aliás...nesse caso...como faço para inserir todos esses objetos numa lista? To usando Java 1.4(Exigencia da aplicação).
Valeu gente.

fcoury

Para o seu caso, o JFileHelpers cai como uma luva. Você teria apenas que anotar a classe MensagemVO, dizendo que você vai usar registros delimitados e depois mapear os campos.

Algo como o exemplo do JFileHelpers:

@DelimitedRecord(",")
public class Customer {
	private Integer custId;
	private String name;
	private Integer rating;
	
	@FieldConverter(converter = ConverterKind.Date, format = "dd-MM-yyyy")
	private Date addedDate;
	
	@Override
	public String toString() {
		String l = System.getProperty("line.separator");
		StringBuffer b = new StringBuffer();
		b.append("Customer: ").append(l);
		b.append("   custId = " + custId).append(l);
		b.append("   name = " + name).append(l);
		b.append("   rating = " + rating).append(l);
		b.append("   addedDate = " + addedDate).append(l);
		return StringHelper.toStringBuilder(this, b.toString());
	}
}

Depois é só fazer:

public static void main(String[] args) throws IOException {
		FileHelperEngine<Customer> engine = new FileHelperEngine<Customer>(Customer.class);	
		List<Customer> customers = new ArrayList<Customer>();
		
		if (args.length < 1) {
			customers = engine.readResource("/samples/customers-delimited.txt");
		}
		else {
			customers = engine.readFile(args[0]);
		}
		
		for (Customer c : customers) {
			System.out.println(c);
		}
	}

Espero que te ajude…

Abraços!

fcoury

Esquece… JFileHelpers precisa de 1.5 por usar anotações. Talvez no futuro tenhamos suporte via XML também.

Que pena! :slight_smile:

Abraços!

arthurgon

Então…mas rola pra Java 1.4?

arthurgon

Td bem…mas com Java 1.4 como vc me recomendaria? Tem solução?

Abraço.

Paulo_Faulstich

Cara esse erro ocorreu pq você ta tentando Formatar um numero mas o que ta vindo é uma String.

Abraço.

fcoury

Você vai ter que continuar no caminho indicado pelos outros que responderam, fazer mais “na mão” mesmo.

arthurgon

Então…mas como disse antes…uso Java 1.4. Essas Annotacions não rolam.
Conhece uma outra forma? Poderia me ajudar? Ainda sequer consegui reconhecer o erro que está dando.

Valeu

sergiotaborda

arthurgon:
Olá meus amigos;

Ainda não deu certo. Estou tendo um erro acredito eu de formatação do texto.
Segue o erro:

java.lang.NumberFormatException: For input string: "CAMPO" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:468) at java.lang.Integer.parseInt(Integer.java:518) at testes.MensagemDAO.main(MensagemDAO.java:25) Exception in thread "main"

Isso é porque provávelmente a primeira linha do arquivo tem o nome das colunas.
Abra o arquivo e veja o formato dele! se é isso, ignore a primeira linha no codigo.


Aliás…nesse caso…como faço para inserir todos esses objetos numa lista? To usando Java 1.4(Exigencia da aplicação).

Cara, tenha calma e leia as coisas direito. Eu já mostrei como adiciona na lista logo no primeiro exemplo.

Vc cria um List e faz add , mas facil impossivel.

arthurgon

Ainda não rolou mesmo criando uma lista. Alguém tem idéia de como resolvo esse erro?

java.lang.NullPointerException
	at java.io.FileInputStream.<init>(FileInputStream.java:103)
	at java.io.FileInputStream.<init>(FileInputStream.java:66)
	at java.io.FileReader.<init>(FileReader.java:41)
O código ficou dessa forma:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import casasbahia.supervisor.vo.MensagemVO;

public class TxtFileMensagemDAO {


	  private String filePath; //"C:/Documents and Settings/arthur.gomes/Desktop/P2DAQ014.txt""  
	   
	     public synchronized  List  findAll() throws Exception{  
	   
	     try {    
	    	 List lista = new ArrayList();
	   
	              FileReader fr = new FileReader(filePath);    
	              // BufferedReader para o FileReader:    
	              BufferedReader br = new BufferedReader(fr);    
	              String line;    
	   
	             while ((line = br.readLine()) != null) {    
	            	 MensagemVO vo = new MensagemVO();  
	                     // faz o parse da linha e seja valores , por exemplo se fosse separado por ;   
	                     String[] fields = line.split(";");  
	                      
	                   int cod_msg = Integer.parseInt(fields[0]);
	     				vo.setCod_msg(cod_msg);
	     			
	     				vo.setDescr_msg(fields[1]);
	     				
	     				int cod_emp = Integer.parseInt(fields[2]);
	     				vo.setCod_emp(cod_emp);
	     				
	     				int cod_fil = Integer.parseInt(fields[3]);
	     				vo.setCod_fil(cod_fil);
	     				
	     				int cod_tiplis = Integer.parseInt(fields[4]);
	     				vo.setCod_tiplis(cod_tiplis);
	     				
	     				vo.setTs_tiplis(fields[5]);  
	                          
	                	lista.add(vo);	
	                    
	             }    
	           
	     		} catch (FileNotFoundException e) {    
	              throw new Exception(e);  
	          }  catch (IOException e) {    
	              throw new Exception(e);  
	          }
		    return null;
		 
	     }
}

E o main ficou assim:

public static void main(String[] args) throws Exception {  
	    	 TxtFileMensagemDAO dao = new TxtFileMensagemDAO();
	           
	    	 List turnos = dao.findAll();  
	    
	         for (int i=0;i<turnos.size();i++) {  
	               
	              MensagemVO vo = (MensagemVO) turnos.get(i);  
	                
	          	System.out.println("Codigo da Mensagem:"+ vo.getCod_msg());
	     		System.out.println("Descricao da mensagem:" + vo.getDescr_msg());
	     		System.out.println("Codigo da Empresa:"+ vo.getCod_emp());
	     		System.out.println("Codigo da Filial:"+ vo.getCod_fil());
	     		System.out.println("Em haver:" + vo.getCod_tiplis());
	     	    System.out.println("Em haver:" + vo.getTs_tiplis()); 
	             
	     	    
	     	    System.out.println("Listado com sucesso!!");  
	          }  
	      }

Se alguem souber

Paulo_Faulstich

Tentou tirar o comentário dessa parte?

private String filePath = "C:/Documents and Settings/arthur.gomes/Desktop/P2DAQ014.txt";

Flw.

arthurgon

Sim...mas mesmo assim o erro persiste.

java.lang.NumberFormatException: For input string: "CAMPO"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
	at java.lang.Integer.parseInt(Integer.java:468)
	at java.lang.Integer.parseInt(Integer.java:518)
	at testes.MensagemDAO.main(MensagemDAO.java:25)
Exception in thread "main"
O código ficou assim:
[code]
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import casasbahia.supervisor.vo.MensagemVO;

public class TxtFileMensagemDAO {


	  private String filePath="C:/Documents and Settings/arthur.gomes/Desktop/P2DAQ014.txt";  
	   
	     public synchronized  List  findAll() throws Exception{  
	   
	     try {    
	    	 List lista = new ArrayList();
	   
	              FileReader fr = new FileReader(filePath);    
	              // BufferedReader para o FileReader:    
	              BufferedReader br = new BufferedReader(fr);    
	              String line;    
	   
	             while ((line = br.readLine()) != null) {    
	            	 MensagemVO vo = new MensagemVO();  
	                     // faz o parse da linha e seja valores , por exemplo se fosse separado por ;   
	                     String[] fields = line.split(";");  
	                      
	                   int cod_msg = Integer.parseInt(fields[0]);
	     				vo.setCod_msg(cod_msg);
	     			
	     				vo.setDescr_msg(fields[1]);
	     				
	     				int cod_emp = Integer.parseInt(fields[2]);
	     				vo.setCod_emp(cod_emp);
	     				
	     				int cod_fil = Integer.parseInt(fields[3]);
	     				vo.setCod_fil(cod_fil);
	     				
	     				int cod_tiplis = Integer.parseInt(fields[4]);
	     				vo.setCod_tiplis(cod_tiplis);
	     				
	     				vo.setTs_tiplis(fields[5]);  
	                          
	                	lista.add(vo);	
	                    
	             }    
	           
	     		} catch (FileNotFoundException e) {    
	              throw new Exception(e);  
	          }  catch (IOException e) {    
	              throw new Exception(e);  
	          }
		    return null;
		 
	     }
[/code]

Alguém consegue me ajudar?
Preciso apenas importar as linhas desse arquivo txt.

o main ficou assim:

public static void main(String[] args) throws Exception {  
	    	 TxtFileMensagemDAO dao = new TxtFileMensagemDAO();
	           
	    	 List turnos = dao.findAll();  
	    
	         for (int i=0;i<turnos.size();i++) {  
	               
	              MensagemVO vo = (MensagemVO) turnos.get(i);  
	                
	          	System.out.println("Codigo da Mensagem:"+ vo.getCod_msg());
	     		System.out.println("Descricao da mensagem:" + vo.getDescr_msg());
	     		System.out.println("Codigo da Empresa:"+ vo.getCod_emp());
	     		System.out.println("Codigo da Filial:"+ vo.getCod_fil());
	     		System.out.println("Em haver:" + vo.getCod_tiplis());
	     	    System.out.println("Em haver:" + vo.getTs_tiplis()); 
	             
	     	    
	     	    System.out.println("Listado com sucesso!!");  
	          }  
	      }  
	
}
Valeu !!
Paulo_Faulstich

Dai guerrero.

presta atenção nessa linha.

int cod_msg = Integer.parseInt(fields[0]);

Em algum dos teus fields está vindo uma String entende.

Por exemplo.

Integer.parseInt("CAMPO");

Como você vai dar um parseInt para uma String? Contendo Letras não tem como né!!

Sugiro que você imprima o retorno detestes fields

tipo.

System.out.println("Retorno do Field = " + fields[0]);

Flw.

sergiotaborda

arthurgon:
Sim…mas mesmo assim o erro persiste.

Vamos lá… já deu para ver que vc está perdidáço e não a menor ideia do que está a fazer
mas tente prestas atenção.

O codigo que escrevemos aqui é para dar uma ideia de como as coisas funcionam.
Já lhe demos todas as dicas. Vc tem que se esforça para encontrear os problemas e resolver.

O atributo filePath é para conter o nome do caminho do arquivo, mas isso foi só um exemplo!!
Na real vc tem que passar esse caminho com um parametro do construtor ou da classe
Se passar um objeto File ainda melhor.

quando vc popula a lista é com o objetivo de a retornar no final, cadê esse retorno ??
Vc está retornando null, assim nunca irá funcionar.

Porque vc está chamando “turnos” uma lista de “MensagemVO” ? tem algo errado ai.
Ou vc deveria chamar “mensagens” ou vc deveria ter objetos Turno ( o VO no final é desnecessário)

Use break points e execute o codigo passo a passo. Veja o que o line contêm e as suas assunções de regras
de parsing estão corretas. Por exemplo, a coluna 0 sempre tem numeros ?

Tenha um pouco mais de atenção e cuidado que vc chega lá.

Criado 11 de junho de 2008
Ultima resposta 12 de jun. de 2008
Respostas 26
Participantes 5