Método que lê arquivo?

12 respostas
paulinhohd
Pessoal vejam o método desenvolvido para ler um txt com campos separados por ; :
public ArrayList<String> getDados(String sSearch,File fFile) {
	ArrayList<String> oList = new ArrayList<String>();
	
	try { 
		Scanner arquivo = new Scanner(fFile);
	    String  linha = null;
        while (arquivo.hasNextLine()) {
            linha = arquivo.nextLine();
            Scanner oScan = new Scanner(linha);
            oScan.findInLine(sSearch);
            oScan.useDelimiter(";");
            oList.add(sSearch); //Filial
            oList.add(oScan.next().toString()); //Atendente
            oList.add(oScan.next().toString()); //Cliente
            oList.add(oScan.next().toString()); //Cidade
            oList.add(oScan.next().toString()); //Estado
            oList.add(oScan.next().toString()); //Nome
            oList.add(oScan.next().toString()); //Cargo
            oList.add(oScan.next().toString()); //Email
            oList.add(oScan.next().toString()); //Telefone
            oList.add(oScan.next().toString()); //Observação            
        }

    } catch (FileNotFoundException e) {
        JOptionPane.showMessageDialog(null, "Erro");
    }
    return oList;   
}

Imaginem o arquivo.txt com o seguinte conteúdo:
01;walter;hahah
02;jorge ;hahah
01;maria;hahah

Executando com mais este trecho do código no action de um botão:
try{
reader = new FileReader(oFile);					
leitor = new BufferedReader(reader);
ArrayList<String> aDados = null;
aDados = getDados(valor,oFile);
System.out.println("Valor-> " +valor);
System.out.println("Retorno-> " +aDados.get(0).toString());
System.out.println("Retorno-> " +aDados.get(1).toString());
System.out.println("Retorno-> " +aDados.get(3).toString());
leitor.close();
reader.close();
					}catch (IOException ex) {			               
			            ex.printStackTrace();
			            System.out.println("Erro no Exception EX");
			        }finally{   
			            try {   
			                leitor.close();   
			                reader.close();   
			            } catch (IOException ey) {   
			            	ey.printStackTrace();
			            	System.out.println("Erro no Exception EY");
			            }   			               
			        }

Ele me retorna o seguinte:

Vejam o valor que passo:
Valor-> 01
Retorno-> 01
Retorno-> walter
Retorno-> hahah

Valor-> 02
Retorno-> 02
Retorno-> 01
Retorno-> walter

Alguém sabe me dizer porque isso acontece?

Obrigado! 8)

12 Respostas

F

Cara acho que com o método split() ficaria mais claro o que está acontecendo.

ViniGodoy

Você tem 3 campos por linha, mas dá 10 next(). Não tem nada de errado aí não?

paulinhohd

O Arquivo que digitei aqui foi só um exemplo, mas em meu arquivo e aplicação real eu tenho tudo isso de campos!

Fernando, tentei usar o linha.split(";"); mas dai bagunçou o coreto do mesmo jeito… :cry:

paulinhohd

Ou seja, sr. Paulinho (que não é o da Força Sindical), uma coisa boa é sempre prestar atenção no que você fez e nos dados que você está usando para testar. Não faça “programação orientada a fé” (também conhecida como POF), ou seja, “faço isto e acredito que vai dar certo”.

Não entendi o lance de não ser da Força Sindical mas beleza!

Sr.Thingol creio que assim como existe a POF como citou existe dúvidas, programação com tentativa e erro leva ao acerto.
E se recorri aqui é porque não consegui nem na fé, nem na tentativa e erro e nem no Google.

Pelo modo como vi que muitos daqui postam respostas, todos são “semi-deuses” no Java e melhor ainda: Já nasceram sabendo Java, nunca, nunca tiveram dúvidas!

Creio que como até já falaram aqui pra mim para fazer perguntas inteligentes, buscar em todos recursos possíveis antes de postar, me mandaram até links mostrando isso, acho que também deveriam haver RESPOSTAS INTELIGENTES e mais respeitosas! :roll:

T

Eu só estava enchendo um pouco seu saco. De qualquer maneira, eu sei que você deve estar lutando com isso, mas eu queria saber: getDados é para retornar uma lista de strings correspondentes a 1 linha apenas, ou a todo o arquivo? Se for para 1 linha apenas, é mais fácil usar Split, como foi sugerido. Vou dar um exemplinho bobo.

List&lt;String&gt; campos = new ArrayList&lt;String&gt;();
String[] arrayCampos = "filial;atendente;cliente;cidade;estado;nome;cargo;email;telefone;observacao".split (";");
campos.add (Arrays.asList (arrayCampos));

Eu realmente não gosto de usar a classe Scanner, ela nem sempre se comporta do jeito que você quer.

paulinhohd

Não a getDados não é só para 1 linha, e sim para o arquivo inteiro.
Porém pego o conteúdo da primeira linha encontrada e jogo numa tela.
Dai quando o usuário clica num botão “Next” continuo a leitura do arquivo e exibo na tela novamnete quando encontra a linha correspondente.
:roll:

T

Para você pegar os dados da segunda linha, você pega os dados de 10 a 19, é isso?

paulinhohd

10 a 19?
Não pelo que eu sei o split eu uso para separar os campos correto? E o arquivo.hasNextLine() já pulava a linha automaticamente não é isso?

T

Não é isso que eu quero dizer.
Eu quero dizer o seguinte: suponha que tudo esteja funcionando perfeitamente do jeito que você quer.
Como é que deveria ficar o ArrayList<String>?
As posições de 0 até 9 são a leitura da primeira linha do seu arquivo.
E as outras posições? Hein?

paulinhohd

Ah saquei, então é ai que está o erro.
Eu achei que ao pular para próxima linha, automaticamente o ArrayList era zerado. Tanto é que tentei na aplicação fazzer ele receber null toda vez que o usuário clicar no botão.
Mas pelo visto pelo que me falou ele conta os campos de todoas as linhas até o fim do arquivo…
Agora fudeu de vez hahaha 8)

T

Você precisava de um conceito que não existe no Java, que é o de “continuations”. Se isso existisse no Java, você poderia simplesmente ir retornando os dados à medida em que você os lesse (como você achava que seu programa fazia), em vez de ler tudo e mandar tudo em um único array.

paulinhohd

É pelo visto terei de ao invés de cirar o “continuous” tentar fazer alguma programação clássica, aquela que poucos fazem, que é de origem chinesa: Gambi Arrá! rs…
Valeu

Criado 26 de agosto de 2008
Ultima resposta 26 de ago. de 2008
Respostas 12
Participantes 4