Leitura de arquivo com scanner

3 respostas Resolvido
java
R

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

[telefone removido];nome1
[telefone removido];nome2
[telefone removido];nome3
[telefone removido];nome4
[telefone removido];nome5
[telefone removido];nome6
[telefone removido];nome7
[telefone removido];nome8
[telefone removido];nome9
[telefone removido];nome10

[telefone removido];nome11
[telefone removido]
[telefone removido];
[telefone removido];nome14
[telefone removido];nome15

meu log

3 Respostas

W
Solucao aceita

O problema é que quando vc faz o split, vc sempre espera que seja retornado um array com 2 elementos: um número e um nome.

Só que no arquivo que está lendo existem linhas que ou estão em branco, ou só tem o número seguido por ponto e virgula sem nome, ou nem ponto e virgula tem.

Nestes casos o split vai retornar um array vazio ou um array com apenas um elemento. Por isso o ArrayIndexOutOfBoundsException.

Sobre a duplicação na saída, é por causa daquele loop dentro do adicionaArquivo.

Corrija-o deixando assim:

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

Não precisa instanciar essa variável aqui.

Se recebe uma linha de cada vez, chame a variável de linha e não de linhas.

Se essa variável armazena os campos, o nome dela deveria ser campos.

Você não precisa do for, como nosso amigo @wldomiciano já explicou.

Entretanto você precisa testar se realmente recebeu 2 campos e se o conteúdo deles é válido.

R

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 :slight_smile:

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());
}
Criado 11 de abril de 2018
Ultima resposta 12 de abr. de 2018
Respostas 3
Participantes 3