Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

leitura de arquivo com scanner

Olá Pessoal boa tarde, adoraria saber se alguém pode me ajudar com esse código abaixo, na minha aplicação o usuário com frequência irá subir alguns arquivos e eles tem duas informações, numero e nome separados por -> ; porem no arquivo eu simulo alguns possíveis problemas como números sem nome e meu código não se comporta bem contra esses possíveis problemas.

Outro detalhe é que meu SOUT esta duplicando e eu não sei porque.

Se alguém puder me ajudar, agradeço.

    public void adicionaArquivo(MultipartFile file) throws IOException {

        InputStream inputStream = file.getInputStream();
        List<ContatoDTO> contato = new ArrayList<>();

        //cria um scanner para ler o arquivo
        Scanner leitor = new Scanner(inputStream);
        //variavel que armazenara as linhas do arquivo
        String linhasDoArquivo = new String();

        //percorre todo o arquivo
        while (leitor.hasNext()) {

            try {
                //recebe cada linha do arquivo
                linhasDoArquivo = leitor.nextLine();

                //separa os campos entre as virgulas de cada linha
                String[] valoresEntreVirgulas = linhasDoArquivo.split(";");

                for (int i = 0; i < valoresEntreVirgulas.length; i++) {
                    ContatoDTO c = new ContatoDTO();
                    c.setTelefone(valoresEntreVirgulas[0]);
                    c.setNome(valoresEntreVirgulas[1]);
                    contato.add(c);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        for (int i = 0; i < contato.size(); i++) {
            System.out.println("telefone : " + contato.get(i).getTelefone());
            System.out.println("Nome : " + contato.get(i).getNome());
        }
        System.out.println("qt de linhas : " + contato.size());
    }

meu arquivo



71999998811;nome1
71999998812;nome2
71999998813;nome3
71999998814;nome4
71999998815;nome5
71999998816;nome6
71999998817;nome7
71999998818;nome8
71999998819;nome9
71999998810;nome10

71999998810;nome11
71999998810
71999998810;
71999998810;nome14
71999998855;nome15

meu log de erro que estava muito grande esta aqui

https://gist.github.com/fariasrod/d9d41e36856845327aa14110af5e3982

3 respostas
solução!

Oi Rodrigo, o problem está nesta linha dentro do seu for:

    c.setNome(valoresEntreVirgulas[1]);

valoresEntreVirgulas[1] não existe quando o nome não é passado e por isso seu array tem apenas o primeiro elemento de índice zero que corresponde ao telefone -- por este motivo a exceção java.lang.ArrayIndexOutOfBoundsException: 1é lançada. Você precisa tratar quando esta situação ocorre, ou seja, quando o tamanho deste array é igual a 1.

Sobre o System.out.println(), ele está duplicando porque você está acrescentando duas vezes cada contato no array no primeiro for:

for (int i = 0; i < valoresEntreVirgulas.length; i++){
    ContatoDTO c = new ContatoDTO();
    c.setTelefone(valoresEntreVirgulas[0]);
    c.setNome(valoresEntreVirgulas[1]);    
    contato.add(c);
 }

Repare que, quando a linha está completa, ou seja, com telefone e nome, valoresEntreVirgulas tem tamanho 2 e então ele vai adicionar esta informação duas vezes.

espero ter ajudado, qualquer novo problema poste aqui.

Meu chute é que o problema está aqui => for (int i = 0; i < valoresEntreVirgulas.length; i++) {

Dentro do seu for você sempre considera que o split trouxe duas informações, mas nem sempre isso é verdade. Você precisa tratar.

Refiz aqui, agora passou certinho sem dar erro e se comportando bem com relação a tudo, isso é oque acho. muito obrigado ai pessoal

se quiserem adicionar algo, sou todo ouvidos :)

public void adicionaArquivo(GrupoDTO grupo, MultipartFile file) throws IOException {

        Validadores validadores = new Validadores();
        InputStream inputStream = file.getInputStream();
        List<ContatoDTO> contato = new ArrayList<>();

        //cria um scanner para ler o arquivo
        Scanner leitor = new Scanner(inputStream);
        //variavel que armazenara as linhas do arquivo
        String linhaDoArquivo;

        //percorre todo o arquivo
        while (leitor.hasNext()) {

            try {
                //recebe cada linha do arquivo
                linhaDoArquivo = leitor.nextLine();

                //separa os campos entre as virgulas de cada linha
                String[] campos = linhaDoArquivo.split(";");

                try {

                    if (!"".equals(linhaDoArquivo)) {
                        if (campos.length == 2) {

                            ContatoDTO c = new ContatoDTO();
                            c.setConta(grupo.getConta());
                            c.setGrupo(grupo.getId());
                            c.setTelefone(validadores.validadorTelefone(campos[0]));
                            c.setNome(campos[1]);
                            contato.add(c);

                        } else if (campos.length == 1) {

                            if (validadores.validadorTelefone(campos[0]) != null) {
                                ContatoDTO c = new ContatoDTO();
                                c.setConta(grupo.getConta());
                                c.setGrupo(grupo.getId());
                                c.setTelefone(validadores.validadorTelefone(campos[0]));
                                contato.add(c);
                            }

                        } else if (campos.length == 0 || campos.length > 2) {

                        }
                    } else {

                    }

                } catch (NullPointerException e) {
                    System.out.println("null pointer aqui!");
                    e.printStackTrace();
                } catch (StringIndexOutOfBoundsException e) {
                    System.out.println("vazou o array!");
                    e.printStackTrace();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        for (int i = 0; i < contato.size(); i++) {
            System.out.println("linha");
            System.out.println("telefone : " + contato.get(i).getTelefone());
            System.out.println("Nome : " + contato.get(i).getNome());
        }
        System.out.println("qt de linhas : " + contato.size());
    }