Erro horrível com busca em arquivo TXT

Olá pessoal…
Estou desenvolvendo um pequeno projeto como trabalho de faculdade. O objetivo é possibilitar escrita, leitura e edição de um arquivo txt via uma interface gráfica, que no meu caso utilizei o Java Swing. Escrever no arquivo foi tudo beleza, agora chegou a parte chata. Preciso que quando o usuário do “sistema” digitar um nome no jTextField e clicar no JButton, seja desencadeada uma busca no arquivo, retornando os dados referentes ao nome caso este exista. Vou postar apenas o código referente à busca e retorno em si. Vejam:

private void submitActionPerformed(java.awt.event.ActionEvent evt) {                                       
       String inserido = pesquisa.getText();
       ArrayList<String> dados = new ArrayList();
       String temp = "";
        
     try {
            FileReader leitorDeArquivo = new FileReader("usuarios.txt");
            BufferedReader carregadorDeArquivo = new BufferedReader(leitorDeArquivo);
            try {
                while(carregadorDeArquivo.ready()){
                    temp += carregadorDeArquivo.readLine()+"\n";
                    
                    if(temp.equals("")){
                        dados.add(temp);
                    }
                }
            } catch (IOException ex) {
                Logger.getLogger(Consulta.class.getName()).log(Level.SEVERE, null, ex);
            }
        String [] cadastros = dados.toArray(new String[dados.size()]);
            
        for(int x=0;x <= cadastros.length;x++){    
            if(cadastros[x].equals(inserido)){
                pesquisa.setText(dados.get(x));
            }
        }   
           
      } catch (FileNotFoundException ex) {
            Logger.getLogger(Consulta.class.getName()).log(Level.SEVERE, null, ex);
      }
    }    

No meu arquivo, os dados estão estruturados da seguinte forma:

Nome.: ******
Endereço.: *****
CPF.: ******

Caso o nome inserido seja igual ao que está no arquivo, o texto do jTextArea deverá ser alterado retornando os dados relacionados àquele nome, no formato que descrevi acima.
Minha lógica é ler o arquivo linha a linha e ir guardando em uma variável temporária até que o “sistema” encontre uma linha vazia, que usei como delimitador. Assim que esta for encontrada, estes valores são guardados em uma ArrayList. Só que como não consegui imprimir o ArrayList dentro do jTextField, o transformei em um Array normal. Mas aí tenho como retorno ao efetuar a busca:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0

Tem mais um monte de linhas, mas tudo detalhando este erro. Pesquisando aqui mesmo no fórum, me pareceu que o tamanho do array foi estourado, o que é estranho, afinal, eu defini o seu tamanho para o mesmo do ArrayList…

Se puderem me dar uma ajuda, ficarei muito grato! :smiley:

O erro ocorre aqui

 if(cadastros[x].equals(inserido)){  

Porque seu objeto dados sempre está vazio. Motivo: O add é feito semente quando o temp está vazio

if(temp.equals("")){ dados.add(temp); }
Faça dessa forma

if(!temp.equals("")){ dados.add(temp); }
E altere o for também. Dessa forma não haverá erro se a lista estiver vazia.

for (int x = 0; x < cadastros.length; x++) {

flw

Amigo, pelo que li do seu código.

Você não vai ter nada dentro do array cadastros, pois nessa sua parte do código:

[code]while (carregadorDeArquivo.ready()
temp += carregadorDeArquivo.readLine() + “\n”;

if (temp.equals("")) {
    dados.add(temp);
}[/code]

você diz pra ele adicionar só se for vazio, mas acontece que nunca será vazio.
e creio que você queira a informação contida no arquivo.

[quote]você diz pra ele adicionar só se for vazio, mas acontece que nunca será vazio.
e creio que você queira a informação contida no arquivo.[/quote]

Bem, é isso mesmo… Preciso do conteúdo do arquivo. É que pra separar os cadastros, usei uma linha em branco. O temp deveria ler até chegar nesta linha, que penso eu que seja representada pelo (""), e quando chegasse, todo o conteúdo seria transferido para uma ArrayList, prosseguindo com a leitura das demais linhas.

Leandro M, o que você disse faz todo o sentido… Só que fazendo estas modificações aqui, o erro some, e continuo não tendo retorno algum retorno no jTextArea…

PedroVinicius, você não está obtendo retorno justamente
por não adicionar nada ao vetor.

Se você debugar seu código, você vai verificar que ele não está adicionando nada
ao seu vetor.

Faça o seguinte, debugue o seu código, e vai verificando o que ele faz a cada interação,
no fim o que ele adiciona.

Bom, agora o próximo passo é você verificar porque o if não retorna true

if(cadastros[x].equals(inserido)){

Mas então… Vocês teriam alguma sugestão de outra forma que eu poderia fazer a mesma coisa? O grande problema aqui é que eu quero retornar estes dados organizados em blocos, para que o retorno seja como um “SELECT * FROM usuarios WHERE nome = ‘Pedro’;” Já pensei em Expressões regulares, mas me parece que é uma bazuca pra atirar em coelho…

Experimenta o contains

if (cadastros[x].contains(inserido)) {

PedroVinicius, o método contains vai te ajudar a achar.

Caso você realmente queira remover caracteres específicos, até para melhor
apresentação não hesite, é muito simples utilizar regex.

Exemplo:

String valor = valor.replaceAll("[^\\w\\d]", "")

onde w significa word(‘palavras’) e d digits(‘dígitos’),
e ^ é operador de negação.

E então amigos… Fiz algumas modificações no meu arquivo. Até a minha linha 11, tudo funciona perfeitamente. Sei disso porque testei solicitar o método retorno.setText() logo após terminar o while e todo o texto do arquivo magicamente apareceu no meu jTextField. Mas a questão de cortar apenas o bloco de texto que necessito ainda não funcionou. Tentei pelo método split() mas também não dá certo. Como podem ver, segui a ideia do Leandro M usando o contains(). Existe algum outro método que eu possa usar para selecionar apenas a parte do texto que o usuário buscar?

private void submitActionPerformed(java.awt.event.ActionEvent evt) {                                     
       
      String temp ="";
      
      try {
            FileReader leitorDeArquivo = new FileReader("usuarios.txt");
            BufferedReader carregadorDeArquivo = new BufferedReader(leitorDeArquivo);
            try {
                while(carregadorDeArquivo.ready()){
                    temp += carregadorDeArquivo.readLine()+"\n";
                }
                
                String[] dadosUser = temp.split(".");
                String inserido = pesquisa.getText();
                
                for(int x=0;x < dadosUser.length;x++){    
                      if(dadosUser[x].contains(inserido)){
                      retorno.setText(dadosUser[x]);
                      } else {
                               JOptionPane.showMessageDialog(null, "Erro!");
                               break;
                      }
                }
                
            carregadorDeArquivo.close();    
            } catch (IOException ex) {
                Logger.getLogger(Consulta.class.getName()).log(Level.SEVERE, null, ex);
            }

PedroVinicius,

Dei uma melhorada no seu código, agora creio que vá funcionar próximo do que
você deseja.

Dá uma olhada:

String[] dadosUser = temp.split("\n"); String inserido = busca; for (int x = 0; x < dadosUser.length; x++) { if (dadosUser[x].contains(inserido)) { System.out.println(dadosUser[x]); } }

Linha 1: disse para ele dividir pela quebra de linha do arquivo.
Linha 4: manteve, se ele tiver a palavra pesquisa em qualquer parte da String ele retorna true.
Linha 5: imprimi resultado completo.

Resultado final: Nome.: MeuNome

O método indexOf pode te ajudar

linha.indexOf("busca");

Vai te retornar a quantidade de caracter que existe até a primeira posição do seu parâmetro de busca.
Testa aí pra ver