StringTokenizer duvida sobre exportação. (RESOLVIDO)

5 respostas
satangoss

Olá pessoal tenho uma rotina de exportação de um arquivo do tipo :

SR;[telefone removido];2010-06-27;2010-06-23;25;0.0;Implementar Rotina de Instalação;
SR;[telefone removido];2010-06-12;2010-06-18;06;0.0;Implementar Pacote 1 Relatórios;

e um método que trata essas strings e separa por tokens pegando a próxima linha com o reader.readLine() dessa forma:

try {
            String encoding = "ISO-8859-1";
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(arquivo.getFile()), encoding));

            int numeroLinhas = 0;

            String dados[] = new String[7];
            String linha = reader.readLine();

            while (!linha.equalsIgnoreCase("")) {
                ValidaLinhaImportada linhaPesquisada = new ValidaLinhaImportada();
                StringTokenizer st = new StringTokenizer(linha, ";");
                numeroLinhas += 1;
                if (st.countTokens() == 7) {
                    dados[0] = st.nextToken();
                    dados[1] = st.nextToken();
                    dados[2] = st.nextToken();
                    dados[3] = st.nextToken();
                    dados[4] = st.nextToken();
                    dados[5] = st.nextToken();

                    dados[6] = st.nextToken();
                    while (st.hasMoreTokens()) {
                        dados[6] = dados[6] + st.nextToken();
                    }

                    setavaloresLinhaPesquisada(linhaPesquisada, numeroLinhas, dados);

                    if (linhaPesquisada.getTipo().equals("OS") && linhaPesquisada.verificaPassouTodasValidacoesOS()) {
                        Os os = setaValoresOs(linhaPesquisada);

                        inserirOS(os, linhaPesquisada.getErro());

                        contSucesso = contSucesso + 1;
                        linha = reader.readLine();
                    } else if (linhaPesquisada.getTipo().equals("SR") && linhaPesquisada.verificaPassouTodasValidacoesServico()) {

                        Servico servico = setaValoresServico(linhaPesquisada);
                        System.out.println("Passou Sucesso---->" + linha + "\n" + linhaPesquisada.getErro());
                        inserirServico(servico, linhaPesquisada.getErro());
                        contSucesso = contSucesso + 1;
                        linha = reader.readLine();

                    } else {
                        System.out.println("Passou erro---->" + linha + "\nErro " + linhaPesquisada.getErro());
                        contErro = contErro + 1;

                        linha = reader.readLine();

                    }
                } else {
                    contErro = contErro + 1;
                    System.out.println("\nRegistro do arquivo[" + numeroLinhas + "] : " + linha + " Erro : Campos não informados!");
                    linha = reader.readLine();
                }
                reader.close();
            }

            System.out.println("Total de linhas: " + numeroLinhas);
            System.out.println("Total de erros:" + contErro);
            System.out.println("Total de itens inseridos com sucesso: " + contSucesso);
            // reader.close();

        } catch (Exception excecao) {
            logger.error("Erro ao tentar efetuar o Upload do Arquivo: " + arquivo.getFile(), excecao);
        }
    }

o código funciona e faz as validações de acordo com a classe valida ValidaLinhaImportada, porem quando as linhas terminam o while continua procurando por uma linha que não tem nenhuma string te tenta valida-la. Onde estou errando na condição do while??

Abraço

5 Respostas

satangoss

Opa pessoal acabei descobrindo sozinho o erro, simplesmente mudei o condicional para

while(linha != null)

e tirei o reader.close() de dentro dele e coloquei pra fora.

ViniGodoy

Por que você está usando StringTokenizer?

Já leu o que diz o Javadoc da classe?

“javadoc do StringTokenizer”:

StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.

The following example illustrates how the String.split method can be used to break up a string into its basic tokens:

String[] result = "this is a test".split("\\s");
     for (int x=0; x<result.length; x++)
         System.out.println(result[x]);

prints the following output:

this
     is
     a
     test

>

satangoss

ViniGodoy:
Por que você está usando StringTokenizer?

Já leu o que diz o Javadoc da classe?

“javadoc do StringTokenizer”:

StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.

The following example illustrates how the String.split method can be used to break up a string into its basic tokens:

String[] result = "this is a test".split("\\s");
     for (int x=0; x<result.length; x++)
         System.out.println(result[x]);

prints the following output:

this
     is
     a
     test

>

OLÁ ViniGodoy obrigado por responder, você teria alguma idéia de como melhorar esse código?
a ideia principal é separar por linhas e cada linha separar por tokens, utilizando como separador o “;”.
Abraço

ViniGodoy

Sim, depois do readline faça:

String dados[] = linha.split(";");

Isso automaticamente dividirá a linha em todos os seus ; e a carregará no vetor dados.

satangoss

ViniGodoy:
Sim, depois do readline faça:

String dados[] = linha.split(";");

Isso automaticamente dividirá a linha em todos os seus ; e a carregará no vetor dados.

vlw vou tentar
Abraço

Criado 2 de agosto de 2010
Ultima resposta 2 de ago. de 2010
Respostas 5
Participantes 2